- ベストアンサー
単語数、文字数のカウントプログラム
以下のような単語数、文字数のカウントプログラムを作ったのですが、10行目に「フォーマットは char ですが、引数は different type です」というエラーが出てしまいます。どのように修正したらよいでしょうか?教えてください。 #include <stdio.h> int main(void){ int wordcnt = 0; int charactercnt = 0; int i; char line[100]; printf("String: "); fgets(line, sizeof(line), stdin); sscanf(line, "%s", &line); if(line[0] != ' '){ wordcnt++; } for(i = 0; line[i] != '\0'; i++){ if(line[i - 1] == ' '){ wordcnt++; } if(line[i] != '\n'){ charactercnt++; } } if(wordcnt == 1){ printf("%d word,", wordcnt); }else{ printf("%d words,", wordcnt); } if(charactercnt == 1){ printf(" %d character", charactercnt); }else{ printf(" %d characters", charactercnt); } return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
char line[100]; と定義していますから, &line の型は char (*)[100] です. これが (%s の期待する) char * と違っているのが原因です. それにしても, なんでこんな風に書くんだろう. 単純に line と書けばいいのに.... あと, この sscanf は危険です. #1 の「sscanfの第1引数はconst char*ですので第3引数に同じものは使わないようにしましょう」は今一つ意味不明ですが, sscanf で「読み取る領域」 (第1引数が示す) と「書き込む領域」 (第3引数以降が示す) が重なっているため未定義動作になっているはずです. C では, ほとんどの関数で「読み書きする部分が重なっていたら動作は未定義」になっています (少ない例外が memmove). あ, sscanf の %s 変換は「最初の方にある空白文字」をすべて読み飛ばしますし「そのあとの最初の空白文字までで変換終了」なので, sscanf のあとの if と for はほとんど無意味です. 仕様を確認してください.
その他の回答 (1)
- php504
- ベストアンサー率42% (926/2160)
10行目と言うことは sscanf(line, "%s", &line); これが問題ですね フォーマットと引数が合わないと言ってますので合わせてください %sはchar*ですが&lineはchar**になります そしてsscanfの第1引数はconst char*ですので第3引数に同じものは使わないようにしましょう。