将char *前缀添加到C中的现有char *的最佳方法

时间:2014-11-11 16:35:56

标签: c arrays char

我有什么:

char * a = "world";
char * b = "Hello";

我需要的是:

char * a = "Hello World";

我需要先添加b。 有没有这样做的功能?

2 个答案:

答案 0 :(得分:3)

您可以使用strcat(3)snprintf(3)asprintf(3)

使用strcat,您需要检查buffer overflow(使用strlen(3) ...) 使用strcat& snprintf,您需要预先分配数组。 使用asprintf,您将获得一个堆分配的缓冲区,并且您需要free它。

所以,使用strcat和固定大小的缓冲区buf

char buf[64];
if (strlen(a)+strlen(b)<sizeof(buf)) {
  strcpy(buf, a);
  strcat(buf, b);
}
// now buf contains "worldhello"

或者您可以使用堆分配缓冲区:
char*buf = malloc(strlen(a)+strlen(b)+1);但不要忘记检查malloc失败:if (!buf) { perror("malloc buf"); exit(EXIT_FAILURE); };然后执行strcpy }&amp; 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)以避免memory leak

另请参阅strdup(3)fmemopen(3)open_memstream

在您的问题中,您应该交换ab

答案 1 :(得分:3)

可以轻松完成,如下所示:

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

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);
}