ページ 11

単語のカウントをできません

Posted: 2016年2月02日(火) 23:15
by motch_misa_ore
こんばんは。今C言語で「文章と単語を入力してもらい、文章中にその単語がいくつあるのかを数える」というプログラムを作っていますが、うまく数えてくれません。ソースコードと実行結果を書きますので一緒に考えていただけますか?

ソースコード↓
#include <stdio.h>
#include <string.h>
#define N 100 //単語の文字数
#define N2 10000 //文章の文字数

int main(void)
{
int i,j; //for文でループカウントするための整数
int len1=0,len2=0;//それぞれ文字列の文字数をカウントする整数
int count=0; //文章中の検索するワードの数を数える整数
char string1[N]; //検索する単語です
char string2[N2]; //検索もとの文章です

//検索するワードを入力してもらいます
printf("%d文字以内の任意の単語を入力してください--->",N);
fgets(string1,N,stdin);
len1 = strlen(string1);
string1[len1 - 1]='\0';//最後の改行を削除します

//検索元の文章を入力してもらいます
printf("%d文字以内の任意の文章を入力してください--->",N2);
fgets(string2,N2,stdin);
len2 = strlen(string2);
printf("\n\n");
string2[len2 - 1]='\0';//最後の改行を削除します

/************ここからがミソ************/
for(i=0;i<len2;i++)
//入力された文章の文字一つ一つをチェックします
{
if(string2==string1[0])
//ワードの頭文字と一致する文字を文章中で発見したら、
{
for(j=0; string2[i+j]==string1[j] && j<len1; j++);
//ワードと同じスペルかを確かめる。ここの条件を考えるのに苦労しました。
if(j==len1)
//もしワードの文字数分確かめたなら、
{
count++;//文章中で見つかった単語数としてカウントしなさい
}
}
}

printf("文章中から単語「%s」は%d個見つかりました\n",string1,count);
printf("\n");

return 0;
}

実行結果↓
100文字以内の任意の単語を入力してください--->respect
10000文字以内の任意の文章を入力してください--->We must respect the will of the individual.


文章中から単語「respect」は0個見つかりました

Re: 単語のカウントをできません

Posted: 2016年2月02日(火) 23:27
by みけCAT
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。

「最後の改行を削除」した分文字数を減らしていないので、最後のナル文字も含めて一致判定してしまっていますね。
試しに探す単語を文章の最後(ピリオドとかも付けない)に置くと、カウントされるはずです。
これを修正するには、

コード:

	string1[len1 - 1]='\0';//最後の改行を削除します

コード:

	if (len1 > 0) string1[--len1]='\0';//最後の改行を削除します
とすればいいでしょう。(len2も同様に)

ただし、これだけだと、例えば入力として

コード:

in
We must respect the will of the individual.
を入れると、出力が

コード:

100文字以内の任意の単語を入力してください--->10000文字以内の任意の文章を入力してください--->

文章中から単語「in」は1個見つかりました
となってしまい、誤ってしまいます。
見つけた文字列の前後に空白や句読点、文字列の最初や終わり(正規表現でいう^や$)が来ているかの判定や、大文字を小文字に変換して判定する処理が必要になるでしょう。

Re: 単語のカウントをできません

Posted: 2016年2月14日(日) 18:20
by motch_misa_ore
ありがとうございました!!!