今天学习了C语言不定参数,C语言中的不定参数主要靠<strarg.h>这个头文件实现,这个头文件包含了va_list()、va_start()、va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访问参数列表未确定的部分。这个变量是由va_start来初始化的。它的第一个参数是va_list的变量名,第二个参数是省略号前最后一个有名字的参数。初始化过程把va_list的变量设置为指向可变参数的第一个参数。
为了访问参数,需要使用va_arg,这个宏接受两个参数(va_list变量和参数列表中下一个参数的类型)访问完最后一个参数,需要调用va_end(),其格式如下:
void fun(int a,...){va_list parameter;va_start(parameter, a);va_arg(parameter, int );}
举个例子,如果要实现求多个数的平均值,因为C中不允许默认参数,所以只能用上述方法进行求平均数,代码如下
int average(int val, ...){va_list arg;int sum = 0;int i = 0;va_start(arg, val);//va_arg();for (i = 0; i < val; i++){sum += va_arg(arg, int);//每调用一次向下取一个}va_end(arg);return sum / val;}
如果要求多个数的最大值可以写为
int average(int val, ...){va_list arg;int max;int sum = 0;int i = 0;va_start(arg, val);for (i = 0; i < val; i++){sum = va_arg(arg, int);if (sum>max)max = sum;}va_end(arg);return max;}
由此我们还可以用stdarg这个宏来模拟printf函数的实现,这里我只是做了模拟了字符串输出,×××与字符型输出代码如下:
#include#include void printd(int n)//把×××按字符型输出{if (n < 0){putchar('-');}if (n){printd(n /10);putchar(n % 10 + '0');}}void my_printf(char* val,...){int ch;va_list arg;va_start(arg, val);while (*val != '\0'){switch (*val){case '%': //遇到%执行switch case语句{if (*(val + 1) == 'c')//输出字符{ch = va_arg(arg, char);putchar(ch);val++; //指针变量向下偏移一个单位}else if (*(val + 1) == 'd'){ch = va_arg(arg, char);//输出×××printd(ch);val++;}else if (*(val + 1) == 's')//输出字符串{char*p = va_arg(arg, char*);while (*p != '\0'){putchar(*p);p++;}val++; //指向头一变量的下一个字符}elseputchar('%');break;}default:{ putchar(*val);break;}}val++;}va_end(arg);}int main() //程序调试{int c =100 ;char*p = "laomasb";char a = 'c';my_printf("%s\n%d\n%c\n", p, c,a);system("pause");return 0;}
这里写得还差很多,比如说%后面加数字的话是没办法识别并且寇冲输出空间的,而且这代码自己看着就比较low。希望大神给出些建议。