函数strcat的变体用于连接任意多个字符串
http://blog.163.com/lvan100@yeah/blog/static/6811721420103483649820/
我们会使用strcat用于连接两个字符串,可是如果我们想让多个字符串只调用一次函数就能完成连接,怎么办呢?
好了,我给出一个结果。
函数原型:
char *vstrcat(const char *first, ...)
{
size_t len;
char *retbuf;
va_list argp;
char *p;
if(first == NULL)
return NULL;
len = strlen(first);
va_start(argp, first);
while((p = va_arg(argp, char *)) != NULL)
len += strlen(p);
va_end(argp);
retbuf = (char *)malloc(len + 1); /* +1 包含终止符 \0 */
if(retbuf == NULL)
return NULL; /* 出错 */
(void)strcpy(retbuf, first);
va_start(argp, first); /* 重新开始扫描 */
while((p = va_arg(argp, char *)) != NULL)
(void)strcat(retbuf, p);
va_end(argp);
return retbuf;
}
这个函数主要是构造一个有可变参数的函数。关于可变参数的只是我会在下一篇文章里介绍。
下面是一个程序实例。
#include <stdlib.h> /* 说明 malloc, NULL, size_t */
#include <stdarg.h> /* 说明 va_ 相关类型和函数 */
#include <string.h> /* 说明 strcat 等 */
#include <stdio.h>
char *vstrcat(const char *first, ...)
{
size_t len;
char *retbuf;
va_list argp;
char *p;
if(first == NULL)
return NULL;
len = strlen(first);
va_start(argp, first);
while((p = va_arg(argp, char *)) != NULL)
len += strlen(p);
va_end(argp);
retbuf = (char *)malloc(len + 1); /* +1 包含终止符 \0 */
if(retbuf == NULL)
return NULL; /* 出错 */
(void)strcpy(retbuf, first);
va_start(argp, first); /* 重新开始扫描 */
while((p = va_arg(argp, char *)) != NULL)
(void)strcat(retbuf, p);
va_end(argp);
return retbuf;
}
int main()
{
char *str = vstrcat("Hello, ", "world!", "I love china!",(char *)NULL);
//最后一个参数必须为空字符。
puts(str);
return 0;
}