• ベストアンサー

空文字列の中身

 C言語の初歩を勉強中のものです。  文字列入力の練習問題で、空文字を入力したら終了という構文があって、模範解答は下記のようになっています。 char buffer[ 81 ]; printf( "文字列入力(80字以内・空文字で終了 )___" ); fgets( buffer, 80, stdin ); if( strcmp( buffer, "" ) == 0 ) { break; }  または、 if( strlen( buffer ) == 0 ) { break; }  ところがこれでは正しく動作せず、bufferの中身を調べると、「 0x0A 」が入力され、文字列の長さは1となっています。実際 if( buffer[0] == 10 ) { break; }  とか、 if( strlen( buffer ) == 1 ) { break; } に書き直すとうまく動きました。  Enterキーだけを押した場合、長さ 0 の文字列 "" が入力されないのは極めて困ったことのような気がするのですが、打開策はあるのでしょうか。  ちなみに環境は、Windows XP と Borland C++ 5.5 および BCC Developer です。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

ちょっと問題に疑問があります。 「空文字を入力したら終了」となっていますが、 解答を見たところ、「空の文字列を入力したら終了」 のように思えます。 「空文字」は、\0で表されるchar型のデータであり、 「空の文字列」は、\0を指すポインタです。 わかりにくいかもしれませんが、これはC言語的には違いがあります。 また、キーボードから「空文字」(\0を表す文字データ)を入力する方法は 聞いたことがないので、おそらく無いと思います。 それはともかく、 fgets()は、改行文字を含めて受け取るという仕様があります。 それと対をなすfputs()は、表示する文字列に、改行文字を付加しません。 だからfgets()で読み込んだ文字列をfputs()で表示するとちょうどいいことになります。 似たようなのにgets()とputs()というのがあります。 gets()は、改行文字を除いて読み込み、 puts()は改行文字を自動的に付加します。 だから、問題では、fgets()のかわりにgets()を使えば 望んだ動作になります。 (引数が異なるので書きかえるときは注意すること) 上記のことは、仕様で決まっているので、 模範解答は何か勘違いしているのだと思います。 もし解答を書いたのが身近にいる先生だった場合、 「ここはfgets()ではなくてgets()のまちがいではないでしょうか?」 と教えてあげてください。

nng2
質問者

お礼

 早速のご指導をありがとうございました。  まだ教科書1冊の途中までしか進んでいないので、問題の理解が十分でないまま安易に質問してしまったようです。  問題文は、「空の文字列を入力したら終了」が正しい表現でした。また、回答も   scanf( "%80s",buffer ); であったのですが、これでEnterを押しても画面で改行されるだけで入力されないので、自分で fgets に変えてしまっていたのでした。  ご指摘あったように gets に変えて試したところ正しく動作しました。入力関数の仕様についてこれから勉強していきたいと思います。お手数をおかけしました。

その他の回答 (1)

回答No.2

この出題者は、stdinから入力すれば改行は入力されないものと勘違いしているうえ、動作確認しないまま出題したようです。 でも、fgetsの仕様はNo1さんのおっしゃるとおり改行を含めて入力する関数だから、空文字のつもりで改行のみ入力すれば、改行コードが入ってきてあたりまえです。 stdinから改行ナシで入力するのであれば、fscanf()や、gets()関数を使用すべきです。

nng2
質問者

お礼

ありがとうございました。No.1の回答者の方へのお礼に書いたように、いろいろ理解が足りませんでした。

関連するQ&A