自分の使っているコンパイラーはgcc9.2です。
AtCoderの問題
https://atcoder.jp/contests/past201912-open/tasks/past201912_d
「長さ Nの整数列がサーバーに保管されている。つい先ほどまで、この列には 1から Nまでの整数が1個ずつ含まれていた。しかし、たった今発生したトラブルにより、列のいずれか 1個の要素が別の 1以上 N以下の整数に書き換えられた可能性がある。あるいは、何の書き換えも発生しなかったかもしれない。
トラブル発生後の整数列 A[1],…,A[N] が与えられる。これを読み込み、書き換えが発生していたかを判定し、発生していた場合にはどの整数がどの整数に書き換えられたかを報告するプログラムを作成せよ。」(詳しくはリンクから参照していただけると幸いです。)
この問題のコードを書いて、自分の環境ではうまく動いているのですが、提出するとコンパイルエラーが出てきてしまいます。
それがこれです。
<追記>(これはAtCoderの提出結果欄のコンパイルエラーコードであって、これ以上のエラーコードはないはずです。(<追記>これが警告文であり、エラーコードではないという事を初めて知りました。故に誤解を招いてしまい大変申し訳ありませんでした。))
./Main.c: In function ‘main’: ./Main.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 5 | scanf("%d",&N); | ^ ./Main.c:10:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] 10 | scanf("%d",&tmp); | ^~
ソースコードはこちらです。
C
1#include<stdio.h> 2#include<string.h> 3int main(){ 4 int N; 5 scanf("%d",&N); 6 //int Ans[N],A,B;<---ここが問題の箇所でした。 7 int Ans[N],A=0,B=0; 8 memset(Ans,0,sizeof(Ans)); 9 for(int i=0;i<N;i++){ 10 int tmp; 11 scanf("%d",&tmp); 12 Ans[tmp-1]++; 13 tmp=0; 14 } 15 for(int i=0;i<N;i++){ 16 if(Ans[i]==2){A=i+1;} 17 if(Ans[i]==0){B=i+1;}} 18 if(A==0){printf("Correct\n");return 0;}else{printf("%d %d\n",A,B);} 19 20 return 0; 21}
なにがいけなかったのでしょうか。それともこれはgccのバージョンの違いによるものなのでしょうか。(AtCoderはGCC9.2.1)
<追記>
私はまだC言語を勉強し始めただけの初心者なので、できる限りのことはしたつもりなのです。例えば、scanf()が0を返してきた場合には終了させるように書き換えてみたり、GCCのバージョンの問題かと思いバージョン7.5.0でも試してみましたが問題なし(つまり、AtCoderでの提出の際にのみエラーが出てしまう)、という感じで試行錯誤しましたが、私が持っている、もしくは調べてわかる情報では解決できなかったので、こちらで質問させていただきました。頂いたご指摘はできる範囲内で極力対処していきたい所存ではありますが、何分知識がないものですから、お手柔らかにお願い致します。
<追記>
指摘していだたいた、問題のサンプルインプット2を試したところ、上手く動作しなかったので、問題点を探しました。
結局、A,Bの値を初期化していなかったことが原因でした。しかし、A,Bの値を初期化せずともサンプルインプット1のケースは上手く動作した点については未だに理解はできていません。
回答2件
あなたの回答
tips
プレビュー