• ベストアンサー

strcmp と strcpy の使い方で疑問

学校のレポートである一文の中から相異なる単語の出現頻度を求めよ。 と言う課題がでたのですが、コンパイルをしたらエラーがでます。いろいろいじったのですがやっぱりできません。力を貸して下さい。 下のはプログラムのわからない箇所の中見です。 combineの中に全て小文字の英文が入ってます。 struct compare { char word[256][256]; int count; }number[256]; を最初に作って、新しくでてきた単語をwordに、また同じ単語が被ったときにcountを一つずつ足していこうとおもってます。 あとbufferは比較するときに一時的に入れておくchar型の変数です。 自分の勝手な予想ですが、strcmpとかには構造体とかが入ったやつは使えないと思っています。 解決策を教えてください。 for(i = 0; i < 256; i++){ number[i].count = 0; } while(scanf("%s", combine) != EOF){ for(i = 0; i < num_word; i++){ if(strcmp(number[i].word, buffer) == 0){ number[i].count++; break; } } if(i == num_word){ strcpy(number[i].word, buffer); num_word++; } } for(i = 0; i < num_word; i++){ printf("%s は %d 回出ました。\n", number[i].word, number[i].count); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

他の方の回答でOKなのだと思いますが、それとは別に初期化の部分で…… for(i = 0; i < 256; i++){ number[i].count = 0; number[i].word[0] = '\0'; /* ← この部分 */ } が必要かなと思います。

その他の回答 (3)

回答No.3

あと、注意を忘れましたが combineはプログラムのつくりから変数になりますので定数にしないで下さい。 char combine[2000]; などとしないで。

回答No.2

1.#1のかたのいうとうり、char word[256]; でよいです。単語数文は number[256];すなわち、あなたのプログラムでも使用している number[i].word に入ります。 おそらく、ここがコンパイルエラーの原因でしょう。 2.あなたのプログラムで使用しているように strcmpとかには構造体とかが入ったやつは使えます。指し示すものが char なら、なんでもかまわんのです。 3.後、変なのは、scanf("%s", combine)です。bufferと結びついていません。 このままだとキー入力してcombineに文字列を格納するのですが、これは思うように動作しない定番です(scanfはストリーム以外、通常使わ(え)ないのです)。 あなたがかいているとうり、combineにすべての単語が含まれたテキストであるなら sscanf(combine,"%s",buffer) になると思います。ただし、最近、離れていますので、文字の区切りや終端の検討はして下さい。

回答No.1

なぜ、 char word[256]; ではなく char word[256][256]; なのかな?

juggle
質問者

補足

早い解答ありがとうございます。 wordの最初の四角括弧は実際に出てくる英単語の文字数分入るスペースを作って、 二つ目の四角括弧は単語それぞれを格納しようと思って二つ作りました。

関連するQ&A