gpt4 book ai didi

c - 使用与其他文件相同的名称命名文件

转载 作者:行者123 更新时间:2023-11-30 15:40:14 25 4
gpt4 key购买 nike

我正在阅读《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'; 的存在。我删除了它,程序仍然运行良好。
编辑
我发布了书中对这些行的评论..

To construct the new name for the output file, the program uses strncpy() to copy the name eddy into the array name. The LEN - 5 argument leaves room for the .red suffix and the final null character. No null character is copied if the argv[2] string is longer than LEN – 5, so the program adds a null character just in case. The first null character in name after the strncpy() call then is overwritten by the period in .red when the strcat() function appends that string, producing, in this case, eddy.red.

最佳答案

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

strncpy 最多复制其第三个参数指定的字符数,并且不保证复制将以 NUL 结尾。设计 strncpy 时,存储空间比现在更加有限,甚至单个字节也很重要。因为如果知道某个字符串的最大长度为 14 个字符,则可以存储一个 14 个字符的字符串,而无需终止 NUL 字符。

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

如果从一开始就在该位置碰巧有一个 NUL 字符,那么它可能会起作用,但这不是您所依赖的,或者编译器不会帮助您。

关于c - 使用与其他文件相同的名称命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com