普段思ったことや、雑記。

Menu & Search

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

2019年8月18日

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は色々と奥が深そうだ。

Article Tags
mmiyauchi

プログラムを書きながらTranceを聴くのが良いですね。みなさんも聴いたほうがいいですよ、Trance。EDMよりハードトランスでしょ。

Related article

Redux(react-redux)における適切な配列要素の更新

2021年8月23日…

CloudFlareの『SSL/TLS 暗号化モード(HTTPS通信設定)』を使用したとき、『ERR SSL VERSION OR CIPHER MISMATCH』のエラーでChromeで発生し、接続できない場合の対処

英語の記事は見当たっ…

Dart(Flutter)についての所見

Dart(Flutter)についての所見

第一印象では、クロス…

Discussion about this post

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Type your search keyword, and press enter to search