【C言語】文字列内の単語の出現回数をカウントするプログラム
はじめに
文字列内の単語の出現回数をカウントするプログラムは、C言語で文字列操作を学ぶ上で非常に有用な課題です。文字列はプログラム内で頻繁に使用されるため、単語のカウントなどの操作は基礎的な技術として重要です。このプログラムは、与えられた文字列内で各単語が何回出現するかをカウントし、結果を表示するものです。
プログラムの流れ
プログラムの流れは以下のようになります:
- 文字列を入力として受け取る。
- 文字列を単語ごとに分割する。
- 各単語の出現回数を数える。
- 出現回数を表示する。
C言語では、文字列操作を行うために、stdio.h
やstring.h
といった標準ライブラリを使用することが多いです。特に、文字列の分割にはstrtok
関数を使用し、出現回数のカウントには配列やハッシュテーブルを用います。
コード解説
ここでは、基本的な文字列内の単語出現回数をカウントするプログラムのコードを示し、各部分を解説します。
#include#include #include #define MAX_WORDS 100 #define MAX_LENGTH 100 // 単語の出現回数をカウントする関数 void count_words(char *str) { char *word; char words[MAX_WORDS][MAX_LENGTH]; int count[MAX_WORDS] = {0}; int word_count = 0; // 文字列を単語に分割 word = strtok(str, " ,.-"); while (word != NULL) { int found = 0; // 単語がすでに出現しているか確認 for (int i = 0; i < word_count; i++) { if (strcmp(words[i], word) == 0) { count[i]++; found = 1; break; } } // 新しい単語なら追加 if (!found && word_count < MAX_WORDS) { strcpy(words[word_count], word); count[word_count] = 1; word_count++; } // 次の単語へ word = strtok(NULL, " ,.-"); } // 結果の表示 for (int i = 0; i < word_count; i++) { printf("%s: %d\n", words[i], count[i]); } } int main() { char str[MAX_LENGTH]; // 入力を受け取る printf("文字列を入力してください: "); fgets(str, sizeof(str), stdin); // 改行を取り除く str[strcspn(str, "\n")] = 0; // 単語のカウント count_words(str); return 0; }
上記のプログラムでは、文字列を入力として受け取り、その中で出現する単語を数えます。strtok
を使用して文字列を区切り、strcmp
で既に出現した単語を検出します。出現した単語は、words
配列に格納され、出現回数はcount
配列で管理されます。
例1: シンプルな文字列
例として、次の文字列を考えます:
入力例: "apple banana apple grape"
この文字列をプログラムに入力すると、次のような結果が得られます:
apple: 2 banana: 1 grape: 1
プログラムは「apple」が2回、他の単語はそれぞれ1回ずつ出現したことを正しくカウントしています。
例2: 複数の単語
次に、もっと多くの単語を含む文字列を試してみましょう:
入力例: "hello world hello hello"
この入力に対する結果は次の通りです:
hello: 3 world: 1
プログラムは「hello」が3回出現し、「world」が1回出現していることをカウントします。
例3: 大文字小文字の区別
C言語ではデフォルトで大文字と小文字が区別されます。次の入力を試してみましょう:
入力例: "Apple apple Apple"
結果は次のようになります:
Apple: 2 apple: 1
ここでは「Apple」と「apple」が異なる単語としてカウントされているため、区別がされていることが確認できます。
例4: 複雑な文字列
複雑な文字列にも対応できます。例えば次のような文字列を入力するとします:
入力例: "I am, an example. This is an example, indeed!"
プログラムは次のように出力します:
I: 1 am: 1 an: 2 example: 2 This: 1 is: 1 indeed: 1
このように、区切り文字(カンマ、ピリオドなど)をうまく処理し、各単語の出現回数を正しくカウントしています。