2014-01-14 32 views
0

我正在阅读C primer Plus第5版,我在I/O章节中。我想出了一个例子(第451页),它做了一些事情,并在某种程度上创建了一个新文件,该文件以现有文件命名,但以.red结尾。例如,如果我有这个文件“测试”,程序会创建一个“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()涡流副本的名称为数组名。 LEN - 5 为.red后缀和最终的空字符留下了空间。 如果argv [2]字符串长于LEN,则不会复制空字符,因此程序会添加空字符以防万一。当strcat()函数追加字符串 (在本例中为eddy.red)时,在strred()调用后名称中的第一个空字符 然后在.red中被 句点覆盖。

回答

1

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

strncpy最多可以拷贝第三个参数给出的字符数,并且不能保证拷贝将以NUL终止。在设计strncpy时,存储比今天更有限,甚至一个字节也很重要。因为如果有人知道某个字符串的最大值为14个字符,则可以存储一个14个字符的字符串,而不包含终止的NUL字符。

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

无论如何,如果从一开始就在那个地方出现NUL字符,但这不是你依赖的东西,或者编译器会帮助你。

+0

明白了!谢谢! – yaylitzis