以下のような単語数、文字数のカウントプログラムを作ったのですが、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;
}
No.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 はほとんど無意味です. 仕様を確認してください.
No.1
- 回答日時:
10行目と言うことは
sscanf(line, "%s", &line);
これが問題ですね
フォーマットと引数が合わないと言ってますので合わせてください
%sはchar*ですが&lineはchar**になります
そしてsscanfの第1引数はconst char*ですので第3引数に同じものは使わないようにしましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
atoi( ) の反対をやりたい
-
テキストデータをそのままバイ...
-
下記のプログラムがコンパイラ...
-
_TCHAR*での引数の読み込み
-
C言語のfor文です。 繰り返しの...
-
str系関数を使わずに二つの文字...
-
至急!C言語文字列置換
-
C言語の入力した文字を反転させ...
-
型変換
-
charからLPTSTRへの変換方法
-
strlen関数と同じ働きをする関...
-
'const char *' 型は 'char *' ...
-
C言語 ミリ秒を日付に変換には
-
文字列から空白を取り除きたい...
-
C言語 共用体について コマンド...
-
C言語 文字列操作
-
c言語プログラミング実行時エラ...
-
間接参照のレベルが異なっています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報