2011-06-26 32 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()関数は、 終端の '\ 0' 文字を含む文字列s、ない の長さを計算します。

だから私はあなたがそれを返すように期待するものは戻らないstrlen()を推測し、その結果、余分な文字が事の仕事を作るために

を書かれている、あなたは十分な大きさのバッファを確保する必要があり、保持することができました文字列全体。

5

文字列"All that glitters is not gold\n"が20文字を超えています。大きなバッファで試してみることをお勧めします。

実際に、Cでの重要な作業を行うつもりなら、一般的な習慣としてstrcpyを決して使用しないことをお勧めします。 strncpyのような関数を使用すると、オーバーフローしないようにバッファサイズを指定できます。

+0

+1は、バッファに書き込まれたバイト数をカウントする関数の使用に関する警告です。 – jpmelos

関連する問題