- ベストアンサー
空文字列の中身
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 です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと問題に疑問があります。 「空文字を入力したら終了」となっていますが、 解答を見たところ、「空の文字列を入力したら終了」 のように思えます。 「空文字」は、\0で表されるchar型のデータであり、 「空の文字列」は、\0を指すポインタです。 わかりにくいかもしれませんが、これはC言語的には違いがあります。 また、キーボードから「空文字」(\0を表す文字データ)を入力する方法は 聞いたことがないので、おそらく無いと思います。 それはともかく、 fgets()は、改行文字を含めて受け取るという仕様があります。 それと対をなすfputs()は、表示する文字列に、改行文字を付加しません。 だからfgets()で読み込んだ文字列をfputs()で表示するとちょうどいいことになります。 似たようなのにgets()とputs()というのがあります。 gets()は、改行文字を除いて読み込み、 puts()は改行文字を自動的に付加します。 だから、問題では、fgets()のかわりにgets()を使えば 望んだ動作になります。 (引数が異なるので書きかえるときは注意すること) 上記のことは、仕様で決まっているので、 模範解答は何か勘違いしているのだと思います。 もし解答を書いたのが身近にいる先生だった場合、 「ここはfgets()ではなくてgets()のまちがいではないでしょうか?」 と教えてあげてください。
その他の回答 (1)
- koma1000nin
- ベストアンサー率30% (342/1133)
この出題者は、stdinから入力すれば改行は入力されないものと勘違いしているうえ、動作確認しないまま出題したようです。 でも、fgetsの仕様はNo1さんのおっしゃるとおり改行を含めて入力する関数だから、空文字のつもりで改行のみ入力すれば、改行コードが入ってきてあたりまえです。 stdinから改行ナシで入力するのであれば、fscanf()や、gets()関数を使用すべきです。
お礼
ありがとうございました。No.1の回答者の方へのお礼に書いたように、いろいろ理解が足りませんでした。
お礼
早速のご指導をありがとうございました。 まだ教科書1冊の途中までしか進んでいないので、問題の理解が十分でないまま安易に質問してしまったようです。 問題文は、「空の文字列を入力したら終了」が正しい表現でした。また、回答も scanf( "%80s",buffer ); であったのですが、これでEnterを押しても画面で改行されるだけで入力されないので、自分で fgets に変えてしまっていたのでした。 ご指摘あったように gets に変えて試したところ正しく動作しました。入力関数の仕様についてこれから勉強していきたいと思います。お手数をおかけしました。