Shammer's Philosophy

My private adversaria

入力バッファクリア方法

先日、scanf卒業 - Shammerismで例示した実装、

int number,i,j;
char str[3];
printf("Type the number:");
fgets(str, sizeof(str),stdin);
number = atoi(str);
printf("Number:%d\n", number);

で、fgetsを連続して行うように修正し、さらに最初のfgetsで3文字以上タイプすると、2回目のfgetsは実行されない。これがバッファをクリアしていないと発生する問題なんだな、きっと。当然、そうなると意図した動作ではなくなってしまうので、バッファをクリアする必要がある。いろいろと方法はあるのだろうけれども、以下のようにしてみました。

char ignore;
fgets(str, sizeof(str), stdin);
if( strchr(str, '\n') != NULL ){/* 改行を含む、つまり、入力文字がバッファに収まった場合 */
    str[strlen(str) - 1] = '\0';/* 改行をNULLに変換 */
}
else {
    do {
        ignore = getchar();
    } while ( ignore != '\n' );
}

こうしておけば、入力バッファの内容をクリアできたように見える。
うーん・・・でも正しいのかどうかはよくわからない。