- ベストアンサー
fgets()
ファイルの中身をコピーするプログラムを作ろうとして fgetsでfgets(buf,sizeof(buf),stdin)とキーボードからコピー元のファイル名を 入力するようにしようと思ったのですがファイルがオープンできず getsを使ってみたらできました。 確認してみたところ fgetsの方はファイル名を入れる配列bufのファイル名の部分の後に"が入ってました aaa.txt" のような感じです。 これはなぜなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そういう決まりです。 マニュアルを読みましょう。 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=gets&dir=jpman-9.1.2%2Fman& | fgets() 関数は、... (略) | は、停止します。改行文字があるなら、保持されます。... | | gets() 関数は、(もしあれば) 改行文字が文字列に格納されないことを除いて (略) 要するに、fgetsは改行文字を保持します。getsは改行文字を保持しません。 fgetsを使う場合、fgetsしたあと、例えばThe Practice of Programming風に buf[strlen(buf) - 1] = '\0'; として改行文字をカットする必要があるでしょう。 > buf[7] 10 '' この10が文字コードだとするとnew line (NL) ですよね。 まさにfgetsだから改行文字が保持されています。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 >間違えましたダブルクォーテーションじゃなくてシングルが2つで中身ない状態みたいですね。 なんと。間違っていたのか。 fgetsの入力文字列の末尾が 10 (\n) で終わるのは当たり前です。 取り除いてください。
お礼
すみません勘違いしてました。 ありがとうございました。
- notnot
- ベストアンサー率47% (4900/10358)
考えにくいですが、可能性としては buf が小さすぎる。 getsだと、サイズを見ないので、bufの後ろのメモリ領域を破壊しながら書き込んでいきます(バッファオーバーフロー)。 bufのサイズが7バイトだとすると、aaa.txt を入力するとそういうことがあり得ます。
補足
bufのサイズは50でやってたので十分だと思います。 デバッグして見てみると buf[0] 97'a' buf[1] 97'a' ....... ....... buf[6] 116't' buf[7] 0 buf[8] -52'フ' buf[9] -52'フ' buf[10] -52'フ' ....... ....... に対し buf[0] 97'a' buf[1] 97'a' ....... ....... buf[6] 116't' buf[7] 10 '' buf[8] 0 buf[9] -52'フ' ....... ....... となっています。 間違えましたダブルクォーテーションじゃなくて シングルが2つで中身ない状態みたいですね。 この書き方って間違ってるんでしょうか?
お礼
ありがとうございました。 改行文字なんですね。理解できました。