关于文件写入,我有一个非常简单的问题。
我有这个程序:
char buf[20];
size_t nbytes;
strcpy(buf, "All that glitters is not goldn");
fd= open("test_file.txt",O_WRONLY);
write(fd,buf,strlen(buf));
close(fd);
令人困惑的是,当我在运行该程序后打开文件test_file.txt
时,我在"所有闪光的都不是"一行后面看到了一些像^C^@^@^@^^^@
这样的字符:请注意,buf的一部分没有被写入,而是出现了这些字符。为什么会这样?
您在该缓冲区中写入了超过19个字符。一旦你做到了,你的程序的行为是未定义的。它可以随心所欲。
分配足够大的缓冲区。如果你需要把它当作一个C字符串,它必须能够容纳所有的字母加上一个终止的0
。
字符串"All that glitters is not goldn"
的长度超过20个字符。我建议你用更大的缓冲区试试。
事实上,如果你打算用C语言做任何不平凡的工作,我建议你永远不要把strcpy
作为一种普遍的习惯。使用像strncpy
这样的函数,它允许您指定缓冲区大小,这样就不会溢出。
libgcc strcpy
手册说:
如果strcpy()不够大(是的,如果程序员很愚蠢或懒惰,并且未能检查大小在复制之前),那么任何东西都可能发生溢流固定长度琴弦是最受欢迎的爆竹技巧
strlen
还说
strlen()函数计算字符串的长度s,而不是包括终止的"\0"性格
所以我猜strlen ()
不会返回您期望的结果,因此额外的字符被写入
为了使它正常工作,您需要分配一个足够大的缓冲区,它可以容纳整个字符串。