コンパイルエラーの対処法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ZEO

コンパイルエラーの対処法

#1

投稿記事 by ZEO » 3年前

今、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);
どうしたらいいでしょうかよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: コンパイルエラーの対処法

#2

投稿記事 by みけCAT » 3年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
ZEO さんが書きました:
3年前
このプログラムをコンパイルすると次のエラーがでて対処法がわかりません
ここには警告しか書かれていないようですが、どのようなエラーが出るのですか?
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 *
scanfの書式%sはchar型のデータへのポインタを要求するのに対し、
char型の配列へのポインタを渡しているため、型の不一致により未定義動作になります。
式中の(ほとんどの)配列は先頭要素へのポインタに変換されるので、bの前の&が余計であり、取るべきです。
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の戻り値を無視しているため、入力エラーがあっても処理に反映できず、誤動作の原因になります。
scanfの戻りが入力を要求する数と同じかをチェックすることで、
入力エラーがあるかのチェックをするコードを追加するといいでしょう。

また、
ZEO さんが書きました:
3年前
char b[a];
scanf("%d",&a);
の部分も誤りですね。
aに値が入る前に要素数として使ってしまっているため、要素数が不定になり、未定義動作になります。
実際の挙動としても、要素数が足りなくなって危険になる可能性が低くないでしょう。
bの要素数をaに依存せず要求される最大の長さに合わせて確保するか、
aに値が入った後にbの要素数を決めるようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ZEO

Re: コンパイルエラーの対処法

#3

投稿記事 by ZEO » 3年前

プログラム通りましたありがとうございます!出力で\nをつけてなかったことが原因でした。
scanfの戻り値についてですが今回bには数字しか入らないので

コード:

scanf("%s[0-9]",b);
[\code]
と制限したのですが
[code]
./Main.c:9:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
    9 |     scanf("%s[0-9]",b);
      |     ^~~~~~~~~~~~~~~~~~
 [\code]
 とまたwarningが出てきてしまいます
 どのようにすればいいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: コンパイルエラーの対処法

#4

投稿記事 by みけCAT » 3年前

警告を無視するか、scanfの戻り値を投げ捨てずチェックするようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ZEO

Re: コンパイルエラーの対処法

#5

投稿記事 by ZEO » 3年前

ありがとうございました!

返信

“C言語何でも質問掲示板” へ戻る