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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
motch_misa_ore

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

#1

投稿記事 by motch_misa_ore » 10年前

こんばんは。今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個見つかりました

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

ソースコードを提示する際は、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個見つかりました
となってしまい、誤ってしまいます。
見つけた文字列の前後に空白や句読点、文字列の最初や終わり(正規表現でいう^や$)が来ているかの判定や、大文字を小文字に変換して判定する処理が必要になるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

motch_misa_ore

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

#3

投稿記事 by motch_misa_ore » 10年前

ありがとうございました!!!

閉鎖

“C言語何でも質問掲示板” へ戻る