C程序设计语言之可变参数的函数浅析(使用stdarg.h头文件)

C语言库函数中可变参数函数真不少,我们经常用到。我们要现实这种可变参数函数,必须用到“stdarg.h”头文件,man一下如下:

#include <stdarg.h>

void va_start(va_list ap, argN);
void va_copy(va_list dest, va_list src);
type va_arg(va_list ap, type);
void va_end(va_list ap);

一、编写这类函数,必须按如下步骤进行:

1、提供一个使用省略号的函数原型;
2、在函数定义中创建一个va_list类型的变量;
3、用宏把该变量初始化为一个参数列表;
4、用宏访问参数列表;
5、用宏完成清理工作。

二、代码分析

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

#define MAX_LENGTH 4096

// 可变参数字符串连接,结果存在buffer中;最后一个参数为NULL。
int multi_string_cat(char *buffer, char *str1, ...);

int main(void)
{
	char buffer[MAX_LENGTH];
	
	char *str1 = "I love";
	char *str2 = " Beijing";
	char *str3 = " and Shanghai";
	char *str4 = " and Tianjin";
	
	int flag;
	
	flag = multi_string_cat(buffer, str1, str2, NULL);
	if(flag == 1) return 1;
	printf("%s\n", buffer);
	
	flag = multi_string_cat(buffer, str1, str2, str3, NULL);
	if(flag == 1) return 1;
	printf("%s\n", buffer);
	
	flag = multi_string_cat(buffer, str1, str2, str3, str4, NULL);
	if(flag == 1) return 1;
	printf("%s\n", buffer);
	
	return 0;
}

// 连接可变参数个字符串,结果存在buffer中。
// 最后一个参数为NULL。
// 成功返回0, 失败返回1。
int multi_string_cat(char *buffer, char *str1, ...)
{
	// 定义参数列表
	va_list ap;
	
	char *p;
	
	if(strlen(str1) >= MAX_LENGTH) return 1;
	strcpy(buffer, str1);
	
	// 初始化可变参数列表
	va_start(ap, str1);
	
	while((p = va_arg(ap, char *)) != NULL)
	{
		if(strlen(buffer) + strlen(p) >= MAX_LENGTH) return 1;
		strcat(buffer, p);
	}
	
	// 关闭初始化列表
	va_end(ap);
	
	return 0;
}


三、运行结果

[root@localhost workspace]# gcc multicat.c -o multicat -Wall
[root@localhost workspace]# ./multicat
I love Beijing
I love Beijing and Shanghai
I love Beijing and Shanghai and Tianjin

Leave a Reply

Your email address will not be published. Required fields are marked *