AtCoder ABC086Aで自分の環境では実行できるのに不正解になる

エラーメッセージ(実際は警告メッセージ)の事にだけついて回答します。
どういう動作をするプログラムを作ろうとしているのかが不明なので、ロジックの中味については見てません。

手元のgcc (Rev3, Built by MSYS2 project) 14.1.0の環境ではそうなってないのですが、
お使いの環境では、fgets関数に「関数返り値を使ってない場合は警告を出せ」という意味のwarn_unused_resultという属性がセットされています。
お書きのコードでは確かに返り値を使ってないので、そういう意味の警告が出ています。

fgets関数の返り値は、「エラーやEOFの場合はNULLを返し、そうでない場合は第一引数(今回はinput)を返す」なので、真っ当なプロフラムの場合は、返り値がNULLかそうでないかの判断をします。
今回は、おそらく学習時の練習問題なのでしょうから、「エラーやEOFは想定しない」という前提に立つなら、そのままでも良いです。

なお、警告が出たとは書かれてませんが、sscanfなどscanf系の関数は、真っ当なプロフラムの場合は返り値のチェックは必須です。返り値は、「書式が合致して、入力値を代入出来た変数の数」なので、この場合は2でないとエラーにします。数字以外を入力すると、01が返ります(EOFが返るケースもあり)。
これも、「あらかじめ決められた形式でないデータが入力されることは想定しない」という前提に立つなら、そのままで良いです。

いろいろ前提付きのプログラムで良いのかなという気はしますが、エラーの場合どうするかなど、問題文に書いてなさそうな気がするので、そういうケースでは「エラーは想定外」で良いのかもしれません。
つまり、質問文の警告メッセージは無視で。

もし、警告が出てる限り、正解扱いにならないのなら、
if(!fgets(input, sizeof(input), stdin)) { exit(1); }とかで。何かメッセージを出してからexit(1)の方が良いと思いますが、そこはお好きに。

コメントを投稿

0 コメント