掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25100

文字検索
投稿者---mine(2006/01/07 14:21:42)


文字型配列の先頭アドレスと文字を受け取り、文字列中に文字が含まれる個数を返す関数。
main()で文字列と入力文字を入力させ、文字型配列の先頭アドレスと文字をsearch_ch()に渡して処理を行わせ結果を表示するプログラムの実行結果が正しくありません。どこをどの様に修正すればいいのかが分かりません。よろしくお願いします。

#include<stdio.h>

#define STRING_SIZE 256

int search_ch(char * , char);

int main(void)
{
    char str[STRING_SIZE];
    char cha;
    int cha_cnt;

    printf("\n");
    printf("Input string : ");
    scanf("%s",&str[0]);
    printf("Input character : ");
    scanf("\n%c",&cha);

    search_ch(&str[0] , str[0]);

    if(cha_cnt >= 1)
    {
        printf("\"%c is %d in %s\"",cha,cha_cnt,&str[0]);
    }
    else{
        printf("\"%c is not found in %s\"",cha,&str[0]);
      }
    printf("\n");

    return 0;
}

int search_ch(char *temp, char cha)
{
    int cha_cnt;
    int cnt1;

    cha_cnt = 0;

    for(cnt1 = 0 ; *(temp + cnt1) != '\0' ; cnt1++)
    {
    if(*temp == cha)
    {
       cha_cnt = cha_cnt + 1;
      }
  else{
       break;
    }
  }

  return cha_cnt;
}


実行結果
Input string : sdfg
Input character : h
"h is 2147344384 in sdfg"



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字検索 25102 iijima 2006/01/07 14:57:01


No.25102

Re:文字検索
投稿者---iijima(2006/01/07 14:57:01)


大きな問題が2つあります。

1.search_ch関数の戻り値をmain関数で受け取っていない

main関数内の"cha_cnt"と、search_ch関数内の"cha_cnt"は、名前は同じで
すが全く別の変数です(それぞれの関数内のローカル変数)。

現在は、main関数内のcha_cntに何も代入されていないので、未初期化時
の値として"2147344384"が表示されているのでしょう。

search_ch関数の戻り値をmain関数側のcha_cntに代入する必要があります。

    cha_cnt = search_ch( &str[0] , str[0] );
    // 本当は第2引数に"cha"を渡すべきじゃないのかな?


2.文字数カウント方法

現在のsearch_ch関数の定義は、

・tempの先頭文字がchaに等しいときは、temp文字列全体の文字数を返す
・そうでないときは0を返す

となっていますが、おそらくそれは意図した動作ではないと思います。
こちらは1の問題を解決した上で、もう少し考えてみてください。



この投稿にコメントする

削除パスワード

No.25103

Re:文字検索
投稿者---mine(2006/01/07 16:29:05)


書き込み有難う御座いました。
言われた通りに修正をしたのですが、まだ、正しく実行しません。

#include<stdio.h>

#define STRING_SIZE 256

int search_ch(char * , char);

int main(void)
{
    char str[STRING_SIZE];
    char cha;
    int cha_cnt;

    printf("\n");
    printf("Input string : ");
    scanf("%s",&str[0]);
    printf("Input character : ");
    scanf("\n%c",&cha);

    cha_cnt = search_ch(&str[0] , str[0]);

    if(cha_cnt >= 1)
    {
        printf("\"%c is %d in %s\"",cha,cha_cnt,&str[0]);
    }
    else{
        printf("\"%c is not found in %s\"",cha,&str[0]);
    }
    printf("\n");

    return 0;
}

int search_ch(char *temp, char cha)
{
    int cha_cnt;
    int cnt1;

    cha_cnt = 0;

    for(cnt1 = 0 ; *(temp + cnt1) != '\0' ; cnt1++)
    {
        if(cnt1 == cha)
        {
           cha_cnt = cha_cnt + 1;
        }
    }
    return cha_cnt;
}


実行結果
Input string : asdf
Input character : f
"f is not found in asdf"


あと、第2引数とはなんでしょうか?


文字数のカウントを*tempではなくcnt1に変更したのですが、
文字数をカウントしません。文字数をカウントさせるにはどうしたらいいのでしょうか?

よろしくお願いします。


この投稿にコメントする

削除パスワード

No.25105

Re:文字検索
投稿者---まきじ(2006/01/07 16:50:48)


>第2引数とはなんでしょうか?

二番目の引数の事です。

>cha_cnt = search_ch(&str[0] , str[0]);

検索する文字は str[0] にあるのですか?

>文字数のカウントを*tempではなくcnt1に変更したのですが
>if(cnt1 == cha)

なぜ cnt1 にしたのですか?
temp が指す配列の要素と比較したいのでは?

>if(*temp == cha)

では常に先頭要素と比較してるので str の文字数になります。


この投稿にコメントする

削除パスワード

No.25106

Re:文字検索
投稿者---wiz(2006/01/07 16:50:59)


第2引数とはここでは

>int search_ch(char *temp, char cha)
char chaのことです

>scanf("\n%c",&cha);
ここで検索する文字を入力させているのに
>cha_cnt = search_ch(&str[0] , str[0]);
ここでその文字を渡していないということです。

>文字数のカウントを*tempではなくcnt1に変更したのですが、
>文字数をカウントしません。文字数をカウントさせるにはどうしたらいいのでしょうか?
tempって言うのは与えられた文字列でしょう
なぜループのカウント数と検索する文字を比較する
なんてことをやるのでしょうか・・・?

初回投稿時のコードですが、

>for(cnt1 = 0 ; *(temp + cnt1) != '\0' ; cnt1++)

ここではちゃんとtempの指す先から+cnt1番目と比較しているのに

>if(*temp == cha)

ここではtempと比較しています。for文の条件式では
+cnt1番目結果と比較されますがtempの指す位置は変化しません。
つまりは常にtempの指す位置を変えずにtempの中身と比較している
ことになります。


この投稿にコメントする

削除パスワード

No.25107

Re:文字検索
投稿者---REE(2006/01/07 16:54:26)


>書き込み有難う御座いました。
>言われた通りに修正をしたのですが、まだ、正しく実行しません。

指摘された箇所の一部しか直していないので、当然でしょう。

>あと、第2引数とはなんでしょうか?

search_ch関数の第2引数のことです。
今のままでは、search_ch関数に探したい文字が伝わっていません。

>文字数のカウントを*tempではなくcnt1に変更したのですが、
>文字数をカウントしません。文字数をカウントさせるにはどうしたらいいのでしょうか?

なぜ、cnt1に変更したのですか?
理由もなしに闇雲にかえてもだめですよ。

*temp:検索文字列の「1文字目」
cnt1:何文字目を調べようとしているかの「カウント」
cha:探したい「文字」
「カウント」と「文字」を比べても無意味でしょう?



この投稿にコメントする

削除パスワード

No.25111

Re:文字検索
投稿者---mine(2006/01/07 17:42:23)


質問に答えて頂いたみなさま、ありがとうございました。
おかげさまで、正確に実行する事が出来ました。
ほんとうに、ありがとうございました。
また、分からないときはお世話になるかもしれませんが、
その時はよろしくお願いします。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧