如何在C语言中串联常数/字面字符串?

我在用C语言工作,我必须把一些东西连接起来。

现在我有这个。

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

如果你有C语言的经验,我相信你会意识到,当你试图运行它时,会出现分段错误。那么我如何解决这个问题呢?

解决办法

在C语言中,"字符串"只是普通的`char'数组。因此,你不能直接将它们与其他"字符串"连接起来。

你可以使用strcat函数,将src指向的字符串附加到dest指向的字符串的末尾。

char *strcat(char *dest, const char *src);

下面是一个来自cplusplus.com的例子

char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");

对于第一个参数,你需要提供目标缓冲区本身。 目标缓冲区必须是一个char数组缓冲区。 例如。char buffer[1024];

确保第一个参数有足够的空间来存储你试图复制到其中的内容。 如果可以的话,使用以下函数是比较安全的。strcpy_sstrcat_s,在这些函数中你必须明确指定目标缓冲区的大小。

请注意。字符串不能作为缓冲区使用,因为它是一个常量。因此,你必须为缓冲区分配一个char数组。

strcat的返回值可以被简单地忽略,它只是返回与第一个参数相同的指针。它的存在是为了方便,并允许你在一行代码中进行连锁调用。

strcat(strcat(str, foo), bar);

所以你的问题可以这样解决。

char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
评论(14)

试图修改字符串字面意义是未定义的行为,这就是类似的情况。

strcat ("Hello, ", name);

就会试图这样做。它将试图把 "name "字符串添加到""Hello, " "字符串字面的末尾,而这并没有很好地定义。

试试这样的方法。它实现了你似乎想做的事情。

char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);

这将创建一个*允许修改的缓冲区,然后将字符串字面意义和其他文本复制到其中。只是要小心缓冲区溢出的问题。如果你能控制输入数据(或事先检查),像我这样使用固定长度的缓冲区是没有问题的。

否则,你应该使用缓解策略,比如从堆中分配足够的内存以确保你能处理它。换句话说,就是像这样。

const static char TEXT[] = "TEXT ";

// Make *sure* you have enough space.

char *message = malloc (sizeof(TEXT) + strlen(var) + 1);
if (message == NULL)
     handleOutOfMemoryIntelligently();
strcpy (message, TEXT);
strcat (message, var);

// Need to free message at some point after you're done with it.
评论(5)

strcat()的第一个参数需要能够容纳足够的空间给串联的字符串。所以要分配一个有足够空间的缓冲区来接收这个结果。

char bigEnough[64] = "";

strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);

/* and so on */

strcat()会将第二个参数与第一个参数连接起来,并将结果存储在第一个参数中,返回的char*仅仅是这个第一个参数,而且只是为了方便你。

你并没有得到一个新分配的、由第一个和第二个参数连接起来的字符串,根据你的代码,我猜你期望得到这个字符串。

评论(0)