学习交流可加
微信读者交流①群 (添加微信:coderAllen)
程序员技术QQ交流①群:736386324
---
前提:ANSI C 为了提高可移植性, 通过头文件stdarg.h提供了一组方便使用可变长参数的宏
我们考虑写一个山寨版的 printf(), 取名为 tiny_printf()
tiny_printf()的第一个参数指定后续的各参数的类型, 第二个参数开始指定需要输出的值
tiny_printf("sdd", "result..", 3, 5);
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
void tiny_printf(char *format, ...)   //原型声明的参数中出现…, 对于这部分的参数是不会做类型检查的
{
    int i;
    va_list ap;    //typedef char *  va_list;
    va_start(ap, format);    //使指针 ap 指向参数 format 的下一个位置,得到了第一个参数
    for (i = 0; format[i] != '\0'; i++) {
        switch (format[i]) {
            case 's':
            printf("%s ", va_arg(ap, char*));   
            break;
            case 'd':
            printf("%d ", va_arg(ap, int));
            break;
            default:
            assert(0);
        }
    }
    va_end(ap);  //标准里指出了对于具有 va_start()的函数需要写 va_end()
    putchar('\n');
}
int main(void)
{
    tiny_printf("sdd", "result..", 3, 5);
    return 0;
}
更多精彩文章扫码关注 [ Allen有话说 ],专注于编程,职场,英语(外企)

原文:https://www.cnblogs.com/Allen5G/p/11695342.html