今、atcorder regular contest 001 のA問題を解いていて次の文を書いたのですが
#include<stdio.h>
int main(){
int a,j,s,i;
int m=100;
int z=0;
char b[a];
scanf("%d",&a);
for(i=0;i<a;i++){
scanf("%s",&b);
}
for(i=1;i<5;i++){
s=0;
for(j=0;j<a;j++){
if(b[j]==i+48){
s+=1;
}
}
if(s>z)
z=s;
if(s<m)
m=s;
}
printf("%d %d",z,m);
return 0;
}
このプログラムをコンパイルすると次のエラーがでて対処法がわかりません
./Main.c:9:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[(sizetype)(a)]’ [-Wformat=]
9 | scanf("%s",&b);
| ~^ ~~
| | |
| | char (*)[(sizetype)(a)]
| char *
./Main.c:7:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
7 | scanf("%d",&a);
| ^~~~~~~~~~~~~~
./Main.c:9:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
9 | scanf("%s",&b);
どうしたらいいでしょうかよろしくお願いします。
コンパイルエラーの対処法
Re: コンパイルエラーの対処法
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
char型の配列へのポインタを渡しているため、型の不一致により未定義動作になります。
式中の(ほとんどの)配列は先頭要素へのポインタに変換されるので、bの前の&が余計であり、取るべきです。
scanfの戻りが入力を要求する数と同じかをチェックすることで、
入力エラーがあるかのチェックをするコードを追加するといいでしょう。
また、
aに値が入る前に要素数として使ってしまっているため、要素数が不定になり、未定義動作になります。
実際の挙動としても、要素数が足りなくなって危険になる可能性が低くないでしょう。
bの要素数をaに依存せず要求される最大の長さに合わせて確保するか、
aに値が入った後にbの要素数を決めるようにするといいでしょう。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
ここには警告しか書かれていないようですが、どのようなエラーが出るのですか?ZEO さんが書きました: ↑3年前このプログラムをコンパイルすると次のエラーがでて対処法がわかりません
scanfの書式%sはchar型のデータへのポインタを要求するのに対し、ZEO さんが書きました: ↑3年前./Main.c:9:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[(sizetype)(a)]’ [-Wformat=]
9 | scanf("%s",&b);
| ~^ ~~
| | |
| | char (*)[(sizetype)(a)]
| char *
char型の配列へのポインタを渡しているため、型の不一致により未定義動作になります。
式中の(ほとんどの)配列は先頭要素へのポインタに変換されるので、bの前の&が余計であり、取るべきです。
scanfの戻り値を無視しているため、入力エラーがあっても処理に反映できず、誤動作の原因になります。ZEO さんが書きました: ↑3年前./Main.c:7:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
7 | scanf("%d",&a);
| ^~~~~~~~~~~~~~
./Main.c:9:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
9 | scanf("%s",&b);
scanfの戻りが入力を要求する数と同じかをチェックすることで、
入力エラーがあるかのチェックをするコードを追加するといいでしょう。
また、
の部分も誤りですね。
aに値が入る前に要素数として使ってしまっているため、要素数が不定になり、未定義動作になります。
実際の挙動としても、要素数が足りなくなって危険になる可能性が低くないでしょう。
bの要素数をaに依存せず要求される最大の長さに合わせて確保するか、
aに値が入った後にbの要素数を決めるようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: コンパイルエラーの対処法
プログラム通りましたありがとうございます!出力で\nをつけてなかったことが原因でした。
scanfの戻り値についてですが今回bには数字しか入らないので
scanfの戻り値についてですが今回bには数字しか入らないので