将文件命名为与其他文件同名的文件

时间:2014-01-14 09:21:38

标签: c strncpy

我正在阅读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。

1 个答案:

答案 0 :(得分:1)

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

strncpy最多复制第三个参数给出的字符数,并且无法保证副本将以NUL终止。回到strncpy设计时,存储比今天更有限,甚至单个字节也很重要。因为如果有人知道,例如,14个字符是某个字符串的最大值,那么可以存储一个14个字符的字符串而不会终止NUL字符。

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

无论如何,它可能会起作用,如果从一开始就在那个地方碰巧有一个NUL角色,但这不是你所依赖的,或者编译器会帮助你。