質問: ### C言語、標準入力(stdin)のバッファのクリア方法について C言語始めたばかりの初心者です。C言語のバッファのクリアの方法がわかりません。教科書にはfflush(stdout)という方法が載っているのですが、それを使わないでお願いします。 ### 設問 画面イメージに従いプログラムを作成しなさい。 6文字以上入力された場合"ERROR:6文字以上です。"と画面にエラーを出力し再入力を求める機能です。 ### 問題 **画面イメージ** 5文字までの文字列を入力してください >abcde 入力したのは5文字です。入力した文字列はabcdeです。 5文字までの文字列を入力してください >aaaaaaaaaaaaaaaaaaaaaa ERROR:6文字以上です。 5文字までの文字列を入力したください。 **fgets関数を使う** ### 該当のソースコード ``` #include //定数定義 #define ARRAY_SIZE 7 void Intrim(char *str){ char *p; p=strchr(str, '\n'); if(p !=NULL){ *p='\n'; } } int main(void){ char str[ARRAY_SIZE]; int n; while(*str !='\n'){ printf("5文字までの文字列を入力してください。>\n"); fgets(str, sizeof(str), stdin); n=strlen(str)-1; str[n-1]='\n'; if(*str =='\n'){ break; } if(n>7){ printf("ERROR:6文字以上です。"); }else{ printf("入力したのは%dです。\n", n); printf("入力した文字列は%dです。\n", str); } } return 0; } ``` ### 試したこと 実行してみたら、aaaaaaaaaaaaaaaaaなどを入れた場合、バッファがクリアされずに入力された文字はaaaaa 入力された文字列はaaaa・・・・とエラーが表示されません。 ### 補足情報(FW/ツールのバージョンなど) fgets関数で取得した改行コード'\n'をstrchr関数でnull文字に変える事もやっています。 正直、自分で書いてみて今現在何をしているのかよくわからない状態です。
回答: サイズ指定で読み込んだ時に、行全部を読み込めなかった場合、残った文字を行末まで無視したいということだと思うので、 ``` while(getchar()!='\n'); ``` です。 `fgets`した後の処理は間違っています。 5文字ちょうど入力した場合、`str`は`"ABCDE\n\0"`で、 6文字以上入力した場合は、`"ABCDEF\0"`と先頭6文字だけ入ります。 `str`の中に`'\n'`があるかどうかを判断して、5文字以下だったか、6文字以上だったかを判断します。 `str`の中に`'\n'`が無かった場合に、上記`while`を実行して`'\n'`が来るまで読み捨てます。 これ以外にも間違っている部分があります。質問とは関係ないので、指摘はやめておきます。 また、間違いではないですが、`#define ARRAY_SIZE 7`としているのに、プログラム中に5とか6とか7とかの数字が出てくるのは、何だかなあと思います。 なお、入力に対する`fflush()`は規格的には未定義動作のはずです。実際には多くの場合は使えると思いますので、使えれば使えばいいかと思います。