我正在阅读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添加到结尾。但是,我无法理解这个name[LEN - 5] = '\0';
的存在。我删除了它,程序仍然运行良好。
编辑
我发布了书中关于这些行的评论..
要构造输出文件的新名称,程序将使用 strncpy()将名称eddy复制到数组名称中。 LEN - 5 参数为.red后缀和最后的空字符留出空间。 如果argv [2]字符串长于LEN,则不会复制空字符 - 5,所以程序添加一个空字符以防万一。第一个null strncpy()调用之后的名称中的字符被覆盖 当strcat()函数追加该字符串时,.red中的句点, 在这种情况下,生产eddy.red。
答案 0 :(得分:1)
在C中,字符串只是字符数组。要知道字符串的结束位置,在最后一个字符后面添加一个'\ 0'字符(字符代码为零的字符,在ASCII字母表中称为NUL字符)。
strncpy最多复制第三个参数给出的字符数,并且无法保证副本将以NUL终止。回到strncpy设计时,存储比今天更有限,甚至单个字节也很重要。因为如果有人知道,例如,14个字符是某个字符串的最大值,那么可以存储一个14个字符的字符串而不会终止NUL字符。
因此,在使用strncpy时,如果要在其他C函数(如strcat)中使用字符串副本,则需要添加缺少的NUL字符,在strncpy没有复制它的情况下。
无论如何,它可能会起作用,如果从一开始就在那个地方碰巧有一个NUL角色,但这不是你所依赖的,或者编译器会帮助你。