c - 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
- 3:我只想将 2 个字节传递给 b
- 4:
sizeof
表现正常 - 5:可是为什么变成了8???
- 6:为什么它会给我随机的东西,比如 kekenny 或 keEkenny
我刚刚迷失了 C 字符串中发生的事情。我过去经常使用 C++,但仍然无法理解 C 字符串的行为方式。
解决方案
根据定义,在声明中:
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)
时,上述表达式中不需要您的强制转换为:sizeof
strncpy(,,*)
size_t
char *strncpy (char Target_String[], const char Source_String[], size_t Max_Chars);
另一方面,strncat的用法确实将字符附加nul
到结果目标字符串的末尾,从而无需显式附加 a nul
。
推荐阅读
- php - 从现有表创建模型 (Symfony3)
- python - 在 Python 中写入一个 .txt 文件,其类名不同(0 到 N)
- java - 共享首选项不会保存数据
- php - 在php中显示带有分页的搜索结果
- jquery - jQuery span 文本复制并用作宽度
- r - 如何在 R 中逐行读取 json 文件?
- javascript - 如何让彩虹风格的背景颜色平滑变化?
- report - Concur / Cognos Report Studio - 创建旅行目的地国家/地区的报告
- java - java Collections中重复删除背后的机制是什么(例如LinkedHashSet)
- javascript - 在 WebStorm 之外执行 WebStorm-npm 项目?