Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】文字列内の各文字の出現頻度を数えるプログラムの書き方

この記事では、文字列内に含まれる各文字(アルファベット)の出現頻度を数えるC言語プログラムの作成方法を解説します。ASCIIコードの仕組みを利用したシンプルな手法なので、初心者の方にも理解しやすい内容です。

アルゴリズム

各文字の頻度をカウントするプログラムは、以下の手順で実装できます。

ステップ1:最大サイズ(MAX)を定義する。
ステップ2:char型とint型の変数を宣言する。
ステップ3:コンソールから文字列を読み込む。
ステップ4:文字列の長さを求める。
ステップ5:各文字の頻度を0で初期化する。
ステップ6:各文字の出現回数の合計を求める。
for(i=0; i<length; i++)
    i. 文字が小文字('a'〜'z')の場合
       frequency[string[i] - 97]++;
    ii. 文字が大文字('A'〜'Z')の場合
        frequency[string[i] - 65]++;
ステップ7:文字列内のすべての文字の頻度を出力する。
if(frequency[i] != 0)
    printf("'%c' = %d\n", (i + 97), frequency[i]);

ポイント:ASCIIコードによるインデックス変換

このアルゴリズムの鍵となるのは、ASCIIコードの値を利用して文字を配列のインデックスに変換する点です。小文字の 'a' のASCIIコードは97、大文字の 'A' のASCIIコードは65です。そのため、string[i] - 97 とすることで小文字を0〜25のインデックスに、string[i] - 65 とすることで大文字を同じく0〜25のインデックスに対応させることができます。

サンプルプログラム

文字列内の各文字の頻度を数えるCプログラムは以下の通りです。

#include <stdio.h>
#include <string.h>
#define MAX 100 // 文字列の最大サイズ
int main(){
    char string[MAX];
    int i, length;
    int frequency[20];
    /* ユーザーから文字列を入力 */
    printf("enter the string:\n ");
    gets(string);
    length = strlen(string);
    /* 各文字の頻度を0で初期化 */
    for(i=0; i<20; i++){
        frequency[i] = 0;
    }
    /* 各文字の出現回数の合計を求める */
    for(i=0; i<length; i++){
        /* 現在の文字が小文字のアルファベットの場合 */
        if(string[i]>='a' && string[i]<='z'){
            frequency[string[i] - 97]++;
        }
        else if(string[i]>='A' && string[i]<='Z'){
            frequency[string[i] - 65]++;
        }
    }
    /* 文字列内のすべての文字の頻度を出力 */
    printf("\nFrequency of all characters in string: \n");
    for(i=0; i<20; i++){
        /* 現在の文字が入力された文字列に存在する場合 */
        if(frequency[i] != 0){
            printf("'%c' = %d\n", (i + 97), frequency[i]);
        }
    }
    return 0;
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。

enter the string:
Tutorials Point
Frequency of all characters in string:
'a' = 1
'i' = 2
'l' = 1
'n' = 1
'o' = 2
'p' = 1
'r' = 1
's' = 1
't' = 3

補足:より安全な入力方法について

サンプルコードでは文字列入力に gets() 関数を使用していますが、この関数はバッファオーバーフローの危険性があるため、現在では非推奨とされています。実際の開発では、fgets(string, MAX, stdin) を使うことで、読み込む文字数を制限し、安全に入力を受け取ることができます。また、大文字と小文字を区別せずにカウントしたい場合は、tolower() 関数を使って文字を小文字に統一してからカウントするとよいでしょう。

  1. Androidで文字列内の各文字の出現回数をカウントする方法【サンプルコード付き】

    この記事では、Androidで文字列内に各文字が何回出現するかをカウントする方法を、実際に動作するサンプルコードとともに解説します。EditTextに入力された文字列を解析し、HashMapを使って各文字の出現回数を集計してTextViewに表示する、シンプルなカウントアプリを作成していきましょう。 ステップ1:Android Studioで新規プロジェクトを作成する まずはAndroid Studioで新しいプロジェクトを作成します。メニューから「File」⇒「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。 ステップ2:レイアウトファイル(act

  2. C言語のgoto文を解説!平方根を計算するサンプルプログラム

    このCプログラムは、5つの数値に対して平方根を計算する例です。変数countには、読み込んだ数値の個数が記録されます。countが5以下である間は、goto read;文によって制御がラベル「read」の位置へ移り、処理を繰り返します。countが5を超えると、終了メッセージを表示してプログラムを停止します。goto文とはgoto文は、通常のプログラム実行の流れ(順次実行)から外れ、制御をプログラム内の別の場所へ強制的に移すために使用されます。ラベルで指定した位置にジャンプすることで、ループ処理やエラー処理などを実現できます。プログラム以下は、goto文を使用したCプログラムの例です。#inc