将char *前缀添加到C中的现有char *的最佳方法
是)我有的:
char * a = "world"; char * b = "Hello";
我需要的是:
char * a = "Hello World";
我需要先添加b。 这样做有什么function吗?
它可以很容易地完成,如下所示:
#include #include #include main() { char * a = "world"; char * b = "Hello"; char *c = malloc(strlen(a)+strlen(b)+1); strcpy(c,b); strcat(c,a); printf("%s\n",c); free(c); }
你可以使用strcat(3) , snprintf(3)或asprintf(3)
使用strcat
您需要检查缓冲区溢出 (使用strlen(3) …)使用strcat
和snprintf
,您需要预先分配数组。 使用asprintf
您将获得一个堆分配的缓冲区,您需要适当地free
它。
所以,使用strcat
和固定大小的缓冲区buf
:
char buf[64]; if (strlen(a)+strlen(b)
或者,您可以使用堆分配的缓冲区:
char*buf = malloc(strlen(a)+strlen(b)+1);
但不要忘记检查malloc
失败: if (!buf) { perror("malloc buf"); exit(EXIT_FAILURE); };
if (!buf) { perror("malloc buf"); exit(EXIT_FAILURE); };
然后像以前一样做strcpy
& strcat
。 当然,你需要在适当的时候free(buf)
。 请注意,你可以保持int lena=strlen(a);
然后strcpy(buf+lena,b)
而不是调用strcat
。
使用snprintf
和固定大小的缓冲区buf
(不需要检查缓冲区溢出,因为snprintf
被赋予缓冲区大小):
char buf[54]; int len= snprintf(buf, sizeof(buf), "%s%s", a, b); // now buf contains "worldhello" and len contains the required length
关于snprintf
是可以理解printf
格式控制字符串(例如, %d
表示十进制整数, %g
表示浮点数,科学计数法等等)
使用asprintf
(在提供它的Linux系统上)
char* buf = asprintf("%s%s", a, b);
但是你需要在适当的时候调用free(buf)
来避免内存泄漏 。
另请参见strdup(3) , fmemopen(3)和open_memstream
在你的问题中,你应该交换a
和b