我有一个关于文件写的非常简单的问题。
我有这个程序:
char buf[20];
size_t nbytes;
strcpy(buf, "All that glitters is not gold\n");
fd= open("test_file.txt",O_WRONLY);
write(fd,buf,strlen(buf));
close(fd);
当我在运行此程序后打开文件test_file.txt
时,我感到困惑的是,在“所有闪闪发光的不是”之后我看到一些像^C^@^@^@^^^@
这样的字符:请注意,部分buf不是写的,而这些字符出现。为什么会这样?
答案 0 :(得分:6)
你在那个缓冲区写了超过19个字符。完成后,程序的行为是不确定的。它可以做任何想做的事。
分配足够大的缓冲区。如果您需要能够将其视为C字符串,则必须能够容纳所有字母和终止0
。
答案 1 :(得分:5)
字符串"All that glitters is not gold\n"
超过20个字符。我建议你尝试使用更大的缓冲区。
实际上,如果你要在C中做任何重要的工作,我建议你永远不要使用strcpy
作为一般习惯。使用像strncpy
这样的函数,可以让你指定一个缓冲区大小,这样就可以清楚地知道你永远不会溢出。
答案 2 :(得分:2)
libgcc strcpy
手册说:
如果是目标字符串 strcpy()不够大(那个 是的,如果程序员是愚蠢的 或懒惰,未能检查大小 在复制之前)然后任何可能 发生。溢出固定长度 字符串是最喜欢的饼干 技术
此外strlen
说
strlen()函数计算 字符串s的长度,而不是 包括终止'\ 0' 字符。
所以我猜strlen ()
不会返回您期望它返回的内容,因此会写出额外的字符
为了使事情有效,你需要分配一个足够大的缓冲区,它可以容纳整个字符串。