こんばんは。今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: 単語のカウントをできません
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
「最後の改行を削除」した分文字数を減らしていないので、最後のナル文字も含めて一致判定してしまっていますね。
試しに探す単語を文章の最後(ピリオドとかも付けない)に置くと、カウントされるはずです。
これを修正するには、 を とすればいいでしょう。(len2も同様に)
ただし、これだけだと、例えば入力として を入れると、出力が となってしまい、誤ってしまいます。
見つけた文字列の前後に空白や句読点、文字列の最初や終わり(正規表現でいう^や$)が来ているかの判定や、大文字を小文字に変換して判定する処理が必要になるでしょう。
「最後の改行を削除」した分文字数を減らしていないので、最後のナル文字も含めて一致判定してしまっていますね。
試しに探す単語を文章の最後(ピリオドとかも付けない)に置くと、カウントされるはずです。
これを修正するには、 を とすればいいでしょう。(len2も同様に)
ただし、これだけだと、例えば入力として を入れると、出力が となってしまい、誤ってしまいます。
見つけた文字列の前後に空白や句読点、文字列の最初や終わり(正規表現でいう^や$)が来ているかの判定や、大文字を小文字に変換して判定する処理が必要になるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)