C语言可变参数解析方法

本文介绍了C语言中可变参数的概念,以printf函数为例,阐述了如何处理可变参数。文章通过讲解相关宏和提供实例,解析了如何在C语言中实现可变参数的功能。

一、可变参数概念

有些函数的参数个数是可变,例如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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值