0

我正在阅读 C Primer Plus 第 5 版,我在 I/O 章节。我提出了一个示例(第 451 页),它做了一些事情,在某些时候它创建了一个新文件,该文件以现有文件命名,但以 .red 结尾。例如,如果我有这个文件“test”,程序会创建一个“test.red”。看不懂下面的。。

char name[LEN];
//some code...

strncpy(name,argv[1], LEN - 5);
name[LEN - 5] = '\0';
strcat(name,".red");

我查看了命令 strcpy 的定义。它将 arv[1](它包含源文件)中的前 LEN-5 个字符复制到名称中。strcat 命令将 .red 添加到末尾。但是,我无法理解 this 的存在name[LEN - 5] = '\0';。我删除了它,程序仍然运行良好。
编辑
我为这些行发表了书中的评论..

为了构造输出文件的新名称,程序使用 strncpy() 将名称 eddy 复制到数组名称中。LEN - 5 参数为 .red 后缀和最后的空字符留出了空间。如果 argv[2] 字符串长于 LEN – 5,则不会复制空字符,因此程序会添加空字符以防万一。当 strcat() 函数附加该字符串时,在 strncpy() 调用之后 name 中的第一个空字符被 .red 中的句点覆盖,在这种情况下产生 eddy.red。

4

1 回答 1

1

在 C 中,字符串只是字符数组。要知道字符串在哪里结束,在最后一个字符之后添加一个 '\0' 字符(字符代码为零的字符,在 ASCII 字母表中称为 NUL 字符)。

strncpy 最多复制其第三个参数给出的字符数,并且不能保证该副本将以 NUL 结尾。在设计 strncpy 的时候,存储空间比现在更有限,甚至一个字节也很重要。因为如果知道某个字符串的最大值为 14 个字符,则可以存储一个 14 个字符的字符串而没有终止 NUL 字符。

因此,在使用 strncpy 时,如果要在其他 C 函数(例如 strcat)中使用字符串副本,则需要添加缺少的 NUL 字符,在这种情况下 strncpy 没有复制它。

如果从一开始就在那个地方碰巧有一个 NUL 字符,它可能仍然有效,但这不是你所依赖的东西,或者编译器会帮助你。

于 2014-01-14T09:38:42.723 回答