变参函数设计
时间:2006-11-10 来源:oliliango
心中的郁闷无以复加,怎么就这么弱呢......大好的时光啊,就这么消逝了.......
以前的一些资料,借郁闷之机发上来备忘吧。
类似printf和sprintf,以及scanf一类的函数参数都是可变的。一般也用不到这样的函数,不过在有的情况下还是很有用了。
示例代码。希望以后自己还能看得懂。
存此备忘。
以前的一些资料,借郁闷之机发上来备忘吧。
类似printf和sprintf,以及scanf一类的函数参数都是可变的。一般也用不到这样的函数,不过在有的情况下还是很有用了。
valist的用法,使用的头文件是stdarg.h 一般的用法是这样(个人理解) va_list args; //声明变量 va_start(args, fmt); //开始解析。args指向fmt后面的参数 TYPE var = va_arg(args, TYPE); //取下一个参数并返回。args指向下一个参数 va_end(args); //结束解析 int vf(const char * fmt,...){}这种类型的函数 |
示例代码。希望以后自己还能看得懂。
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> void myprintf(const char * fmt,...) { va_list args; char buffer[1024]={}; va_start(args,fmt); vsprintf(buffer,fmt,args); puts(buffer); va_end(args); } int sum(int num, ... ) { int result = 0; va_list argptr; va_start(argptr, num); for(; num > 0; num--) { result += va_arg(argptr, int); } va_end(argptr); return result; } void my_printf(char *format, ... ) { va_list argptr; va_start(argptr, format); while ( *format != 0 ) { switch (*format) { case 's': printf("Printing a string: %s\n", (char*) va_arg(argptr, char*)); break; case 'c': printf("Printing a char: %c\n", (char) va_arg(argptr, int)); break; case 'd': printf("Printing a integer: %d\n", (int) va_arg(argptr, int)); break; default: break; } format++; } va_end(argptr); } int main() { char bf[2][20]={"hello","world."}; myprintf("%s,%d,%x,%s","hello",1,2,"world."); myprintf("%s,%d,%x,%s",bf[0],1,2,bf[1]); myprintf(bf[0],1,2,bf[1]); myprintf("hahaha\n"); my_printf("sds\n","hello",1,"world."); my_printf("sds\n",bf[0],1,bf[1]); my_printf(bf[0],1,2,bf[1]); return 0; } |
存此备忘。
相关阅读 更多 +