ここから本文です

C言語で英文から各単語の出現回数を表示するプログラムをつくっているのですが、わ...

b10********さん

2011/4/3017:48:00

C言語で英文から各単語の出現回数を表示するプログラムをつくっているのですが、わからなくて悩んでいます。 He is a Heと入力したら
he 2個
is 1個
a 1個
と表示するようにしたいです。

自分で作ってみたプログラムは以下のとおりです。配列を2つ用意し、片方にファイルから読み込んだ文章を入力し、もう片方に検索する単語を入れます。 とりあえず自分で考えたやりかたでやったので、分かりにくいと思いますがプログラムに詳しい方よろしくお願いします。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (void){

FILE *fp;
char *s1;
char *s2;
char ss1[100]={ }; /*配列の中身を全部空欄(スペース)にする*/
char ss2[10]={ };
int i,count;

if((fp=fopen("reibunn","r"))==NULL){
printf("ファイルが見つかりません\n");
exit(EXIT_FAILURE);
}

for(i=0;i<100;i++){
if((ss1[i]=fgetc(fp))==EOF) /*ss1にファイルから文章を読み込む*/
break;
}

s1=ss1;
s2=ss2;

for(i=0;i<3;i++){ /*ファイルから読み込む文章がHe is a He としたため、単語の種類が3種類しかないのでとりあえず3回
繰り返しています*/

count=0;

while(' '==(*s1)){
s1++;
}

while((*s1)!=' '){
*s2=*s1;
s2++; /*配列ss2に単語を入力*/
s1++;
}

s1=ss1;
s2=ss2;

while((s1=strstr(s1,s2))!=NULL){
count++;
for(i=0;i<strlen(s2);i++){ /*文章中の検索した単語の部分を全部空欄にする*/
*s1=' ';
s1++;
}
}

printf("%s %d個\n",ss2,count);

s1=ss1;
s2=ss2;
}

fclose(fp);

return (EXIT_SUCCESS);
}

-------------------------------------
出力
he 2個

だけで終わってしまいます。どうやったら正しく表示されるのでしょうか。よろしくお願いします。

閲覧数:
8,246
回答数:
3

違反報告

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

fus********さん

2011/5/112:37:01

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
FILE *fp;
char *p, *q;
char ss1[100];
char ss2[10] = " ";
int i, count;

if((fp=fopen("reibunn","r"))==NULL){
printf("ファイルが見つかりません\n");
exit(EXIT_FAILURE);
}

i = fread(ss1, sizeof *ss1, sizeof(ss1) / sizeof(*ss1) - 1, fp);
ss1[i] = '\0';

while( p = strpbrk(ss1, ".,:\"\n") ) *p = ' ';
p = strcat(ss1, " ");

for(;;) {
while( *p == ' ' ) p++;
if( *p == '\0' ) break;

q = &ss2[1];
while ( *p != ' ' ) *q++ = *p++;

strcpy(q, " ");
q = p;

for( count = 1; (q = strstr(q, ss2)) != NULL; count++ )
for( i = 0; i < strlen(ss2) - 1; i++ ) *q++ = ' ';

printf("%s%d個\n", &ss2[1], count);
}

return 0;
}

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

2011/5/1 16:42:19

笑う 心から感謝します! 助かりました!!! ありがとうございます!

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

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

pyo********さん

2011/4/3023:47:33

"単語"の定義を書くこと。

>char ss1[100]={ }; /*配列の中身を全部空欄(スペース)にする*/
意図どおりにならない。
配列の初期化について再確認すること。

k03********さん

2011/4/3021:52:06

b1008040さん

「プログラム言語C」
の本文に例が書いてある。

あわせて知りたい

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

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

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

本文はここまでです