一、可变参数概念
有些函数的参数个数是可变,例如printf()函数,其函数原型为:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);
二、处理可变参数的相关宏
// 初始化va_list变量arg_ptr,用来存储参数地址的指针
// prev_param是可变参数列表的前一个参数,即最后一个固定参数
void va_start( va_list arg_ptr, prev_param );
// 根据参数的类型,通过va_list变量arg_ptr来获取参数的值
type va_arg( va_list arg_ptr, type );
// 结束可变参数处理
void va_end( va_list arg_ptr );
va在这里是variable-argument(可变参数)的意思。 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件。
三、解析可变参数实例
void printLog(char* format, …)
{
va_list args;
va_start(args, format);
MyPrintLog(char *format, args);
va_end(args);
}
void MyPrintLog(char *format, va_list args) {
char logText[2048];
char temp[1024];
int i = 0, index = 0;
int len = strlen(format);
memset(logText, 0, sizeof(logText));
for (i=0; i<len-1; i++)
{
if (format[i] == '%')
{
if (format[i+1] == 's')
{
char *param = va_arg(args, char *);
memset(temp, 0, sizeof(temp));
sprintf(temp, "%s", param);
memcpy(logText+index, temp, strlen(temp));
index += strlen(temp);
i++;
}
else if (format[i+1] == 'd')
{
int param = va_arg(args, int);
memset(temp, 0, sizeof(temp));
sprintf(temp, "%d", param);
memcpy(logText+index, temp, strlen(temp));
index += strlen(temp);
i++;
}
else
{
logText[index] = format[i];
index++;
}
}
else
{
logText[index] = format[i];
index++;
}
}
if (i == len-1)
{
logText[index] = format[i];
}
// logText为最终的打印信息
printf("%s", logText);
}
本文介绍了C语言中可变参数的概念,以printf函数为例,阐述了如何处理可变参数。文章通过讲解相关宏和提供实例,解析了如何在C语言中实现可变参数的功能。

被折叠的 条评论
为什么被折叠?



