• 締切済み

fgets関数を使用したときの文字あふれについて

fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

fgetsの仕様は確認されていますか? fgetsは読み込んだ改行文字'\n'をバッファに格納します。 改行文字'\n'が格納されないのはバッファから溢れた場合とEOFに達した場合です。 また、 >printf("入力した文字列の長さは%dです\n" ,strlen( buf )); strlen()の戻り値の型はsize_tです。 sizeof(int) == sizeof(size_t) とは限りませんから"%d"では環境によって正しく出力されない事もありますし、たまたま正しく出力されてるように見えてるだけの事もあります。

回答No.4

fgetsは行末の改行をバッファに読み取ります。 このため, buf[strlen(buf) - 1] == '\n' が成立する場合は行末まで読み込んでおり,成立していない場合は読み残しがある状態になります。 「その行内で読んだ文字数」を保持する変数を一つ用意して,fgetsで読み込んだ文字数を追加していき, 行末まで読んだ場合にその変数の内容を出力して変数の内容を0にすることで,今回の問題に対処することができます。 ただし,最終行に改行を必要とするかはimplemation-definedであるため,それへの対処として, ループを抜けた時点で上記変数が0でなければ,文字数を出力する必要があります。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

対処としては既に回答があるのでいいとして…。 >int main ( int, char *[] ); main()のプロトタイプ宣言って必要でしたかね? >int main ( argc, argv ) >int argc; >char *argv[]; >{ かなり古い記述方法ですが、使用しているコンパイラと参照している資料はいつのものです? >if( fgets == NULL ){ >break; >} ここのif文の意図を説明できますか? おそらく勘違いしている可能性が高いので。 # fgetsのポインタがNULLだったらここまで到達出来ないので、何を判定すんのかなぁ…と。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

fgetsは ・可能なら改行文字まで読み込む ・文字数が多い場合は、途中で切れる ・どちらの場合も、文字列終端の'\0' は付加される という特徴があります。 「最後の文字を調べて、改行文字でなければ、途中で打ち切られたと判断して、(続きを読む等の)処置をする」というのが常套手段です。 そのようにするなら、自前で読み込むようにするか、fgetsを使わずにgetchar等を使って一文字ずつ確認するようにするか、でしょう。 ところで、本当に256でしたか?

  • honor
  • ベストアンサー率35% (25/71)
回答No.1

参考URLにあふれた文字をgetchar()で改行まで読み飛ばす方法が提案されています。

参考URL:
http://okwave.jp/qa/q549060.html

関連するQ&A

専門家に質問してみよう