c语言不定参数与printf函数的实现
程序员文章站
2022-04-23 17:07:47
今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list()、va_start()、va_end...
今天学习了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<stdio.h> #include<stdarg.h> 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++; //指向头一变量的下一个字符 } else putchar('%'); 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。希望大神给出些建议。
推荐阅读
-
C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
-
C#函数的参数传递方式1(值传递与地址传递)
-
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
-
C语言中堆内存的开辟和释放与内存处理函数
-
C语言中va(可变函数参数) 的另一种用法与危险事项
-
C语言学习之Linux下TCP服务器与客户端的实现
-
用C语言写一个函数返回参数二进制中1的个数
-
More Effective C++----(12)理解"抛出一个异常"与"传递一个参数"或"调用一个虚函数"间的差异
-
C语言使用strcmp()函数比较两个字符串的实现
-
C语言:字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”。