前面说了如何 很原始的实现可变参数的问题
http://www.cnblogs.com/niniwzw/archive/2009/11/06/1597464.html
但是,这样的方法可移植性比较的查,不同的cpu ,32 位 ,64 位可以变量对其的方法有差别。
比较好的做法是用 c内部的函数库来实现。
不废话了,贴上代码:
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
char *vstrcat(const char *first, ...);
int main(int argc, char **argv)
{
char *p = vstrcat("混沌", "是好孩子吗", "?");
printf("%s\n", p);
free(p);
}
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)
strcat(retbuf, p);
va_end(argp);
return retbuf;
}
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
char *vstrcat(const char *first, ...);
int main(int argc, char **argv)
{
char *p = vstrcat("混沌", "是好孩子吗", "?");
printf("%s\n", p);
free(p);
}
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)
strcat(retbuf, p);
va_end(argp);
return retbuf;
}