我在 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?
我在 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?
这是因为在 C 中,“字符串”存储为字符数组,后跟一个空字节。这是约定俗成的。因此,空字节可能不会出现在任何 C 字符串中。
但是,实际字符串本身不包含空字节(这只是字符串表示的一部分),因此会strlen
报告字符串中非空字节的数量。要创建一个连接两个字符串的 C 字符串,您需要为空终止符留出空间。
事实上,每个字符串操作都需要以某种方式处理空终止符。不幸的是,细节因函数而异(例如snprintf
,它是否正确,但strncpy
危险地不同),您应该非常仔细地阅读每个函数的手册,以了解谁负责处理空终止符以及如何处理。
您需要为用于终止 C 中的字符串的 '\0'(NULL 字符)分配空间。
即字符串“cat”实际上是“cat\0”。
如果字符串是“猫”:
char * mystring = "cat";
然后 strlen(mystring) 将返回 3。
但实际上存储 mystring 需要 4 个字节,存储空字符需要 1 个字节。
因此,如果您有两个字符串,“dog”和“cat”,它们的长度将是 3 和 3 ,尽管存储它们所需的字节数各为 4。存储它们的连接所需的内存为 3+3 +1 = 7。
所以 malloc 中的 1 是分配额外的字节来存储空字符。