首页 > 解决方案 > C 字符串的行为很奇怪

问题描述

\0第一个问题是关于字符串末尾的空字符,在何时\0需要/自动添加方面有很多变化。声明 char 数组时,是否需要指定\0?或者在什么情况下,我应该指定\0,什么情况下不?谁能给个全面的总结?(如在这篇文章中)。如果您觉得我的问题模棱两可,那么更具体的问题是在 C 中声明一个字符串时,最好的方法是什么,是吗char string[] = "first string",因为例如,通过这种方式,我可以strcat(string, another_string)不用担心大小问题?

第二个问题:我有

1   char a[] = "kenny";
2   char b[3];
3   strncpy(b, a, (int)(sizeof(b) - 1));
4   printf("%i\n", (int)sizeof(b)); // 3
5   printf("string length: %i\n", (int)strlen(b)); // string length: 8
6   printf("%s\n", b); // give me random stuff like kekenny or keEkenny 

我刚刚迷失了 C 字符串中发生的事情。我过去经常使用 C++,但仍然无法理解 C 字符串的行为方式。

标签: carraysstring

解决方案


根据定义,在声明中:

char string[] = "first string"

string精确地填充了它可以容纳的所有内容:

在内存中它看起来像这样:

|f|i|r|s|t| |s|t|r|i|n|g|\0|?|?|?|
/// end of legal memory    ^

...说明为什么以下声明:

strcat(string, anythingElse);

未定义的行为。(否则被一些人称为鼻恶魔。)

另外,关于strncpy(,,)的用法。因为它不能保证nul在使用后包含一个字符,所以建议始终明确地将 附加nul到新字符串中的正确位置:

strncpy (target, source, n);
target[n] = 0;

在您的示例中,n==(sizeof(b) - 1)

请注意,当用作第三个参数的类型(int)时,上述表达式中不需要您的强制转换为:sizeofstrncpy(,,*)size_t

char *strncpy (char Target_String[], const char Source_String[], size_t Max_Chars);

另一方面,strncat的用法确实将字符附加nul到结果目标字符串的末尾,从而无需显式附加 a nul


推荐阅读