MMiyauchi Blog

C言語でscanfの直後のfgetsが動かない場合の対応

C言語をちゃんとやろうと、HackerRankの問題を解き出したところでCの標準入力でちょっとしたワナにかかった。
変に色々調べてしまって、小一時間使ってしまった。問題は、このようなコードがあったとして、入力受付が2回発生すると思いきや、そうはならない。

scanf("%d", &i);
fgets(str, 256, stdin);

原因としては、fgetsが改行コードから読み出しを開始するようで、fgets直前のscanfしている行をこのように変更すれば意図するように動作する。

scanf("%d\n", &i);
fgets(str, 256, stdin);

問題の解決には、下記のStack Overflowの記事を参照した。

Input in C. Scanf before gets. Problem – Stack Overflow
https://stackoverflow.com/questions/2366509/input-in-c-scanf-before-gets-problem

記事によると、他にも色々やり方があるようで、scanfに改行をつけないで、fgetsのあとでsscanfをするなどのパターンもあるらしい。

C言語は今年のGWのcatコマンド写経からやっておらず、そもそも問題を解くというのは大学ぶりかもしれない。最初はfgetsではなくてgetsをしていたら、非推奨とコンパイラに怒られるし、Cは色々と奥が深そうだ。

モバイルバージョンを終了