2011-06-26 77 views
0

我有一個關於文件寫入的非常簡單的問題。寫入文件

我有這樣的程序:

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,而是會出現這些字符。爲什麼?

+1

字符串''所有閃爍的不是金\ n「'是31個字符的長度。 –

+0

相當愚蠢的我沒有看到 –

回答

6

您正在寫入超過19個字符的緩衝區。一旦你完成了,你的程序的行爲是不確定的。它可以做任何想做的事情。

分配足夠大的緩衝區。如果您需要能夠將它視爲C字符串,它必須能夠適合所有字母加終止0

2

libgcc的strcpy手冊說:

如果 的strcpy的(目標字符串)不是足夠大(即 是,如果程序員是愚蠢 或懶惰,並沒有檢查大小 在複製之前),則可能發生任何事情 。溢出的固定長度 字符串是最喜歡的爆竹 技術。

另外,strlen

strlen的()函數計算 的字符串s,不 包括終止 '\ 0' 字符的長度。

,所以我想strlen()不回你希望它返回什麼,因此多餘的字符寫入

爲了使東西的工作,你需要分配一個足夠大的緩衝區,可容納整個字符串。

5

字符串"All that glitters is not gold\n"超過20個字符。我建議你用更大的緩衝區來嘗試。其實,如果你打算在C中做任何不重要的工作,我建議你永遠不要使用strcpy作爲一般習慣。使用像strncpy這樣的函數可以讓你指定一個緩衝區大小,這樣就很清楚你永遠不會溢出。

+0

+1警告使用計數字節寫入緩衝區的函數的使用。 – jpmelos