【发布时间】:2019-02-06 15:25:50
【问题描述】:
第一个问题是关于字符串末尾的空字符\0,在何时需要/自动添加\0 方面有很多变化。
声明 char 数组时,是否需要指定\0?或者在什么情况下,我应该指定\0,什么情况下不?谁能给个全面的总结? (如this post)。如果您觉得我的问题模棱两可,那么更具体的问题是在 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
- 3:我只想传2个字节给b
- 4:
sizeof行为正常 - 5:可是为什么变成了8???
- 6:为什么它会给我随机的东西,比如 kekenny 或 keEkenny
我刚刚迷失了 C 字符串中发生的事情。我以前经常使用 C++,但仍然无法理解 C 字符串的行为。
【问题讨论】:
-
不,你不能“不关心大小问题就做
strcat(string, another_string)”。没有串联空间。 -
为了
printf可以打印字符串,它应该是一个正确的以空字符结尾的字符串。但是您的代码故意截断空终止符。 -
您的代码将显示 undefined behavior。它可能有时会起作用,然后突然就不起作用了。
-
@WeatherVane 这就是为什么我这样做了
strncpy(b, a, (int)(sizeof(b) - 1));,因为我担心尺寸问题,但它仍然在以后的代码中给了我随机的东西? -
您叙述中的示例是
char string[] = "first string"; strcat(string, another_string);没有空间,因为string的大小正好是13 个字节,以'\0'终止符结尾。