こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

単語数、文字数のカウントプログラム

以下のような単語数、文字数のカウントプログラムを作ったのですが、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;
}

投稿日時 - 2008-10-31 07:48:15

QNo.4442993

すぐに回答ほしいです

質問者が選んだベストアンサー

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 はほとんど無意味です. 仕様を確認してください.

投稿日時 - 2008-10-31 12:23:26

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

10行目と言うことは
sscanf(line, "%s", &line);
これが問題ですね
フォーマットと引数が合わないと言ってますので合わせてください
%sはchar*ですが&lineはchar**になります
そしてsscanfの第1引数はconst char*ですので第3引数に同じものは使わないようにしましょう。

投稿日時 - 2008-10-31 08:50:59

あなたにオススメの質問