プロが教える店舗&オフィスのセキュリティ対策術

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関数を使用すると不可能なのではないか?と思っています。
分かる方が居ましたらどうか教えて下さい。
よろしくお願いします。

A 回答 (5件)

fgetsの仕様は確認されていますか?


fgetsは読み込んだ改行文字'\n'をバッファに格納します。
改行文字'\n'が格納されないのはバッファから溢れた場合とEOFに達した場合です。

また、

>printf("入力した文字列の長さは%dです\n" ,strlen( buf ));

strlen()の戻り値の型はsize_tです。
sizeof(int) == sizeof(size_t) とは限りませんから"%d"では環境によって正しく出力されない事もありますし、たまたま正しく出力されてるように見えてるだけの事もあります。
    • good
    • 1

fgetsは行末の改行をバッファに読み取ります。


このため,
buf[strlen(buf) - 1] == '\n'
が成立する場合は行末まで読み込んでおり,成立していない場合は読み残しがある状態になります。
「その行内で読んだ文字数」を保持する変数を一つ用意して,fgetsで読み込んだ文字数を追加していき,
行末まで読んだ場合にその変数の内容を出力して変数の内容を0にすることで,今回の問題に対処することができます。

ただし,最終行に改行を必要とするかはimplemation-definedであるため,それへの対処として,
ループを抜けた時点で上記変数が0でなければ,文字数を出力する必要があります。
    • good
    • 0

対処としては既に回答があるのでいいとして…。



>int main ( int, char *[] );

main()のプロトタイプ宣言って必要でしたかね?

>int main ( argc, argv )
>int argc;
>char *argv[];
>{

かなり古い記述方法ですが、使用しているコンパイラと参照している資料はいつのものです?

>if( fgets == NULL ){
>break;
>}

ここのif文の意図を説明できますか?
おそらく勘違いしている可能性が高いので。
# fgetsのポインタがNULLだったらここまで到達出来ないので、何を判定すんのかなぁ…と。
    • good
    • 0

fgetsは


・可能なら改行文字まで読み込む
・文字数が多い場合は、途中で切れる
・どちらの場合も、文字列終端の'\0' は付加される
という特徴があります。

「最後の文字を調べて、改行文字でなければ、途中で打ち切られたと判断して、(続きを読む等の)処置をする」というのが常套手段です。

そのようにするなら、自前で読み込むようにするか、fgetsを使わずにgetchar等を使って一文字ずつ確認するようにするか、でしょう。


ところで、本当に256でしたか?
    • good
    • 0

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



参考URL:http://oshiete.goo.ne.jp/qa/549060.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A