ここから本文です

#include <stdio.h> int main(void) { char str[256]; char ch;//探索を格納...

pgg********さん

2019/1/2702:40:21

#include <stdio.h>

int main(void) {
char str[256];
char ch;//探索を格納する
int cnt=0;

printf("文字列を入力: ");
scanf("%s[^\n]",str);
scanf("%c",&ch);

printf("調べる文字:");
scanf("%c",&ch);

while(str != '\0'){
if(str == ch){
cnt++;
}
str[0]++;
}

printf("%cの個数:%d",ch,cnt);

return 0;
}




C言語プログラムです。
目的は文字を入力して同じ文字がいくつあるのかを出力するものです。

abcDDeと打って
Dと探せば
Dが2つある

といったものです。
ただエラーがでてしまいます。
どうやら配列とポインタや、その他基本的なことが理解できていないためです。
私個人では解決できそうにないのでそこで申し訳ないのですが、このプログラムを目的に沿ったものに直してはいただけないでしょうか?
また、説明を入れていただけると幸いです。

(エラー内容)
main.c:16:8: warning: comparison between pointer and integer
if(str == ch){

閲覧数:
42
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

her********さん

2019/1/2704:13:54

str[0]++;
これは、str の最初に読み込んだデータをインクリメントします。

入力した文字列が "Hello" だったら、
最初の文字 'H' をインクリメントするして、多くの場合 'I' になります。

やりたいことは、文字を検索するため
調べる文字を示す位置をずらさなければいけないので、
str[0]++
ではなく
str++
としたいはずです。
しかし、str は配列のポインタです。
ポインタを動かす事は出来ないので、
ポインタ変数にポインタをコピーするなり、
ポインタからの相対アドレッシングによって
アクセスする位置を変える必要が有ります。

前者の場合、
#include <stdio.h>
int main(void)
{
char str[256];
char *p;
char ch;
int cnt = 0;
printf("文字列を入力: ");
scanf("%[^\n]", str);
scanf("%c", &ch);
printf("調べる文字:");
scanf("%c", &ch);
for (p = str; *p != '\0'; p++) {
if (*p == ch) {
cnt++;
}
}
printf("%cの個数:%d", ch, cnt);
return 0;
}
の様に、ポインタ変数 p を作ってそれを動かします。

後者の場合、
#include <stdio.h>
int main(void)
{
char str[256];
char ch;
int cnt = 0;
int i;
printf("文字列を入力: ");
scanf("%[^\n]", str);
scanf("%c", &ch);
printf("調べる文字:");
scanf("%c", &ch);
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == ch) {
cnt++;
}
}
printf("%cの個数:%d", ch, cnt);
return 0;
}
の様に、str からの相対位置を計算させます。

  • 質問者

    pgg********さん

    2019/1/2719:58:39

    ありがとうございます。
    非常にわかりやすいです!

    ただここの部分について少し疑問に思うことがあります。
    printf("文字列を入力: ");
    scanf("%[^\n]", str);
    scanf("%c", &ch);
    printf("調べる文字:");
    scanf("%c", &ch);

    流れとしては
    1.文字を「スキャン集合の否定」で改行がくるまで入力できるようにする。
    そして、入力したものはバッファに読み込まれてから、変数strに格納
    しかし、バッファには改行文字が残っている
    2.そのバッファに残ってる改行を取り除くために、chでとってアドレスに格納される。
    3.chのアドレスに調べる一文字を入力できるようにする。

    だと思っております。

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/1/28 02:38:54

様々なパターンで紹介してくださりとてもわかりやすかったです。
ありがとうございました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

n2q********さん

2019/1/2711:15:12

エラー内容を点検しましょう。


main.c:16:8: warning: comparison between pointer and integer
【試訳】main.c の16行目でポインタ・整数間の比較


if(str == ch){


~コンパイラの気持ち~

str は文字配列、ch は文字。配列を比較することは出来ないためポインタとして解釈しますよ。文字についても整数という扱いとします。そして改めてポインタと整数を比較するとしまして、あら、いや、無理すれば出来るけど、大丈夫なのかなぁ。警告を出しておこう。


というわけです。str 配列の先頭要素の位置をポインタとしてですね、つまり &str[0]、これと ch の値、つまり文字コード、この両者を比較するという形になります。まったく無意味であり、無理に比較しても駄目ですよね。コンパイラの心配は当たっていることになります。



str[i] と ch の比較なら大丈夫です。i 番目の文字と ch を比較するということですから。while 文のところを変えると良いですよ。

具体的なものは her********さんがお示しになっている通りです。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる