首页 > 学院 > 开发设计 > 正文

C语言可变参数列表详述及实现printf函数

2019-11-10 22:11:11
字体:
来源:转载
供稿:网友
/*可变参数列表可变参数列表是通过宏来实现的,这些宏定义stdarg.h头文件,它是标准库的一部分。这个头文件声明了一个类型va_list和三个宏——va_start、va_arg、va_end。我们可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值。注意:1.这些宏无法判断实际存在的参数的数量。          2.这些宏无法判断每个参数的类型。*///测试用例:#include<stdio.h>#include<windows.h>#include<stdarg.h>#include<assert.h>void my_PRintf(char*format, ...);void myPutInt(int a);int main(){int i = 123;char j = 'w';char*str = "happy everyday!";my_printf("a=%d/nb=%c/n*str=%s/n", i, j, str);system("pause");return 0;}//定义my_prinf,实现打印3种类型 int char 字符串void my_printf(char*format, ...){assert(format);va_list va_cur;//定义一个va_list类型变量va_curva_start(va_cur, format);// 初始化va_arg这个变量。它的第一个参数是va_ list变量的名字,                       //第二个参数是省略号前最后一个有名字的参数。const char *start = format;while (*start){if (*start == '%'){*start++;switch (*start){case 'd':{    int _int = va_arg(va_cur, int);/*为了访问可变参数,需要使用va_arg,                               这个宏接受两个参数:va_list变量和参数列表中下一个参数的类型*/myPutInt(_int);start++;break;}case 'c':{char _char = va_arg(va_cur, char);putchar(_char);start++;break;}case 's':{char*_str= va_arg(va_cur, char*);   while (*_str){putchar(*_str++);}start++;}}}else{putchar(*start);*start++;}}va_end(va_cur);//当访问完最后一个可变参数之后,需要调用va_end}//递归将一个整型值转换为字符并打印void myPutInt(int a){int value;value= a / 10;if (value){myPutInt(value);}putchar(a % 10 + '0');/*每次调用putchar函数得到变量value的最后一个数字,并对value进行模10 取余运算,其结果是一个0到9之间的整数。并把它与字符常量‘0’相加,其 结果是对应这个数字的ASCII字符,然后把这个字符打印出来*/

}


上一篇:jdbc之批处理

下一篇:Ant脚本学习

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表