質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

358閲覧

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

Example

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2024/07/06 09:20

実現したいこと

AtCoder ABC086AをC言語(gcc 12.2.0)で提出したい。

発生している問題・分からないこと

自分の環境では問題なく動作しますが、AtCoderに提出したコードで、1_002.txtの部分が不正解になります。

エラーメッセージ

error

1Main.c: In function ‘main’: 2Main.c:9:5: warning: ignoring return value of ‘fgets’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 3 9 | fgets(input, sizeof(input), stdin); 4 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(int argc, char **argv) 5{ 6 int a, b, result; 7 char input[256]; 8 9 fgets(input, sizeof(input), stdin); 10 sscanf(input, "%d %d", &a, &b); 11 12 result = a + b; 13 14 if (result % 2 == 0) 15 { 16 puts("Odd"); 17 } 18 else 19 { 20 puts("Even"); 21 } 22 return 0; 23}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

sscanfをsscanf_sに変更したりもしましたが、その場合は以下のエラーが私の環境で出ました。

main.c: In function ‘main’:
main.c:10:5: warning: implicit declaration of function ‘sscanf_s’; did you mean ‘sscanf’? [-Wimplicit-function-declaration]
10 | sscanf_s(input, "%d %d", &a, &b);
| ^~~~~~~~
| sscanf

補足

環境
OS:WSL2 Ubuntu
エディタ:Cursor
gccのバージョン:gcc 12.3.0
gccのバージョンに問題があるのかと思い、gcc12.2.0にしようとしましたが、私の環境で変更することができませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/07/06 09:33

問題文には、「 aとbの積」と書かれていますので、 result = a * b; ではないでしょうか。また、偶数と奇数の判定が逆になっています。
jimbe

2024/07/06 11:19

エラーメッセージ (warning) は fgets の戻り値を無視していることを指摘しているだけですから、「1_002.txtの部分が不正解」は関係ありません。
thkana

2024/07/07 01:49

(「試したこと・調べたこと」の選択肢に「エラーメッセージを精読・精査した」というのが欲しいなぁ...)
otn

2024/07/07 02:11

「AtCoder ABC086A」でググルと問題文らしきものが見えたので、読んでみましたけど、 この問題の解答だとすると、プログラムのコピペでファイルを取り違えてませんか??
guest

回答2

0

ベストアンサー

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

手元の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)の方が良いと思いますが、そこはお好きに。

投稿2024/07/06 11:20

otn

総合スコア85458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2024/07/07 01:45

返り値を無視することの意図的な表現の定番に (void)func() ってのがありませんでしたっけ。競技プログラミングだから異常系なんて気にしないのでしょうし。
otn

2024/07/07 03:14

なるほど。今回のケースは、チェックするのが当然なので、そういう手は考えませんでしたが、警告回避目的ならありですね。 > 競技プログラミング へー、競技プログラムのサイトだったんですね。
guest

0

問題文はaとbの積を求めるという問題だったのですが、私は
result = a + b;
と書き、resultにaとbの和を代入してしまっていて、プログラミング以前に読解力が足りていませんでした。
今後は、質問をするときは
プログラムの内容は問題文にあっているかをしっかりと確認するようにします。

また、回答をもらって放置という非常に失礼なことをしてしまったため、
今後は1つ1つのコメントや回答をしっかりと見て積極的に問題解決に迎えるように頑張ります。

投稿2024/07/14 08:43

Example

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問