0

我在 stackoverflow 上找到了这个函数,它将两个字符串连接在一起。这是功能:

char* concatstring(char *s1,char *s2)
{
 char *result = malloc(strlen(s1)+strlen(s2)+1);
 strcpy(result,s1);
 strcat(result,s2);
 return result;
}

我的问题是,为什么我们在 malloc 调用中加 1?

4

3 回答 3

3

这是因为在 C 中,“字符串”存储为字符数组,后跟一个空字节。这是约定俗成的。因此,空字节可能不会出现在任何 C 字符串中。

但是,实际字符串本身不包含空字节(这只是字符串表示的一部分),因此会strlen报告字符串中非空字节的数量。要创建一个连接两个字符串的 C 字符串,您需要为空终止符留出空间。

事实上,每个字符串操作都需要以某种方式处理空终止符。不幸的是,细节因函数而异(例如snprintf,它是否正确,但strncpy危险地不同),您应该非常仔细地阅读每个函数的手册,以了解谁负责处理空终止符以及如何处理。

于 2012-11-24T23:22:28.913 回答
1

您需要为用于终止 C 中的字符串的 '\0'(NULL 字符)分配空间。

即字符串“cat”实际上是“cat\0”。

于 2012-11-24T23:21:25.177 回答
0

如果字符串是“猫”:

char * mystring = "cat";

然后 strlen(mystring) 将返回 3。

但实际上存储 mystring 需要 4 个字节,存储空字符需要 1 个字节。

因此,如果您有两个字符串,“dog”和“cat”,它们的长度将是 3 和 3 ,尽管存储它们所需的字节数各为 4。存储它们的连接所需的内存为 3+3 +1 = 7。

所以 malloc 中的 1 是分配额外的字节来存储空字符。

于 2012-11-24T23:25:25.123 回答