c 语言函数可变参数的处理
/************************************************************************* > File Name: va_list.c > Author: zshh0604 > Mail: zshh0604@.com > Created Time: 2014年10月14日 星期二 15时16分09秒 ************************************************************************/ #include<stdio.h> /*** 在 c中使用可变参数, c语言中提供一个va_list类型要存储函数的可变参数。 1.在c语言中定义函数的可变参数方法如下: 一:该参数必须在最后。 二:最后一个参数必须声明可变参数的类型。如下 三:可以参数是使用三点表示。 四:在函数调用的使用通过fmt这个字符参数进行参数类型和参数个数的设定。如:"%s%d%c%f" void test(char *fmt,...); 2.如果使用可变参数。 c提供一个如下一组函数: void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src); 对可变参数进行操作。函数原型。 void va_start(va_list ap,last); 函数功能: 将ap依次指向可变参数。 函数参数: ap:会依次指向每一个可变参数。 last:是fmt,它的作用是,规定了参数可变参数的个数,和类型。 函数返回值: 没有返回值。 在调用该组函数之前必须先调用va_start()函数。 通过fmt格式化字符中的格式。来一次获取该参数的值。 char *s; int d; char c; while(*fmt) { switch(*fmt++) { case 's': s = va_arg(ap, char *); break; case 'd': d = va_arg(ap, int); break; case 'c': c = va_arg(ap, char); break; } } va_end(ap); 在函数结束前,必须调用va_end()函数。 使用vsnprintf()直接使用ap. vsnprintf():函数原型如下: int vsnprintf(char *str, size_t size, const char *format, va_list ap); 该方法使用如下: // va_list 的作用: // 头文件<stdarg.h>提供了遍历未知数据和类型的函数参数表的功能。 // 那么,在函数f内声明一个类型为va_list的变量ap.它将依次指向每个实际的参数。 // // va_list ap; // // 在访问任何未命名的参数前,必须使用va_start宏初始化ap一次。 // // va_start(va_list ap,lastarg); // // 此后每次执行宏va_arg都将产生一个与下一个未命令的参数具有相同类型和数值的值。 // 它同时还修改ap,以使得下一次执行va_arg时返回下一个参数。 // // 类型 va_arg(va_list ap,类型); // // void ve_end(va_list ap); // // 在所有处理的参数处理完毕之后。且在退出f之前,必须调用宏va_end一次。 // // void va_end(va_list ap); **/ /************************************************************************* > File Name: snprintf.c > Author: zshh0604 > Mail: zshh0604@.com > Created Time: 2014年10月14日 星期二 13时21分13秒 ************************************************************************/ #include<stdlib.h> #include<stdio.h> #include<stdarg.h> char * make_message(const char *fmt, ...) { int n; /* 用来记录vsnprintf()的返回之。 如果这个值小于等于-1,寿命。分配的空间不够。 如果这个值大于-1,但是n不小于size,那么应该把该值加1,(size+1),否则将空间加大一倍 ***/ int size = 100; /* Guess we need no more than 100 bytes. */ char *p, *np; va_list ap; if ((p = malloc(size)) == NULL) return NULL; while (1) { /* Try to print in the allocated space. */ va_start(ap, fmt); //通过这个函数,使得ap指向可变参数中每一个参数。 n = vsnprintf(p, size, fmt, ap); //将ap指向的参数格式化到p中。p的最大大小为size.按照fmt格式打印。 va_end(ap); //使用结束之后,调用va_end(ap);函数。 /* If that worked, return the string. */ if (n > -1 && n < size) return p; /* Else try again with more space. */ if (n > -1) /* glibc 2.1 */ size = n+1; /* precisely what is needed */ else /* glibc 2.0 */ size *= 2; /* twice the old size */ if ((np = realloc (p, size)) == NULL) { free(p); return NULL; } else { p = np; } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。