【C言語】文字列内の数字の出現回数をカウントする方法を解説

C言語で文字列内の数字の出現回数をカウントする方法を学びたいですか?この記事では、数字の判定方法から始めて、実際のコード例を使って数字の出現回数をカウントするアルゴリズムを解説します。

また、複数の文字列や特定の数字に対するカウント方法、そしてよくあるエラーとその対処法についても紹介します。

目次から探す

数字の判定方法

文字列内の数字をカウントするためには、まず文字が数字であるかどうかを判定する方法を理解する必要があります。

C言語では、数字の判定方法として主に2つの方法があります。

1つはASCIIコードを利用する方法、もう1つは標準ライブラリのisdigit関数を利用する方法です。

数字のASCIIコード

ASCIIコードは、文字を数値で表現するための標準的なコード体系です。

数字の文字(‘0’から’9’)は連続したASCIIコードを持っています。

具体的には、以下のようになります。

文字ASCIIコード
‘0’48
‘1’49
‘2’50
‘3’51
‘4’52
‘5’53
‘6’54
‘7’55
‘8’56
‘9’57

この特性を利用して、文字が数字であるかどうかを判定することができます。

具体的には、文字のASCIIコードが48から57の範囲内にあるかどうかをチェックします。

#include <stdio.h>
int main() {
    char ch = '5';
    if (ch >= '0' && ch <= '9') {
        printf("%c は数字です。\n", ch);
    } else {
        printf("%c は数字ではありません。\n", ch);
    }
    return 0;
}

このコードでは、変数chが数字であるかどうかを判定し、結果を出力します。

isdigit関数の利用

C言語の標準ライブラリには、文字が数字であるかどうかを判定するための便利な関数isdigitが用意されています。

この関数は、<ctype.h>ヘッダファイルに定義されています。

isdigit関数は、引数として渡された文字が数字(‘0’から’9’)であれば非ゼロの値を返し、そうでなければゼロを返します。

これを利用することで、より簡潔に数字の判定を行うことができます。

#include <stdio.h>
#include <ctype.h>
int main() {
    char ch = '5';
    if (isdigit(ch)) {
        printf("%c は数字です。\n", ch);
    } else {
        printf("%c は数字ではありません。\n", ch);
    }
    return 0;
}

このコードでは、isdigit関数を利用して変数chが数字であるかどうかを判定し、結果を出力します。

以上のように、C言語ではASCIIコードを利用する方法とisdigit関数を利用する方法の2つの方法で文字が数字であるかどうかを判定することができます。

次のセクションでは、これらの方法を用いて文字列内の数字の出現回数をカウントするアルゴリズムについて解説します。

数字の出現回数をカウントするアルゴリズム

アルゴリズムの概要

文字列内の数字の出現回数をカウントするためのアルゴリズムは非常にシンプルです。

以下の手順で行います。

  1. 文字列を1文字ずつ走査する。
  2. 各文字が数字かどうかを判定する。
  3. 数字であればカウントを増やす。
  4. 文字列の終端まで繰り返す。
  5. 最終的なカウントを出力する。

擬似コードの紹介

以下に擬似コードを示します。

この擬似コードは、上記のアルゴリズムを簡潔に表現したものです。

count = 0
for each character in string:
    if character is a digit:
        count = count + 1
print count

実際のコード例

ここでは、上記のアルゴリズムをC言語で実装した例を紹介します。

必要なヘッダファイルのインクルード

まず、必要なヘッダファイルをインクルードします。

stdio.hは標準入出力を扱うために必要で、ctype.hは文字判定関数を使用するために必要です。

#include <stdio.h>
#include <ctype.h>

メイン関数の定義

次に、メイン関数を定義します。

ここでは、文字列の入力と数字のカウント処理を行います。

int main() {
    // ここにコードを追加していきます
}

文字列の入力と初期化

文字列を入力し、カウントを初期化します。

ここでは、固定の文字列を使用しますが、ユーザーからの入力を受け取ることも可能です。

int main() {
    char str[] = "Hello123World456";
    int count = 0;
    
    // ここにコードを追加していきます
}

数字のカウント処理

文字列を1文字ずつ走査し、数字かどうかを判定してカウントします。

int main() {
    char str[] = "Hello123World456";
    int count = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (isdigit(str[i])) {
            count++;
        }
    }
    
    // ここにコードを追加していきます
}

結果の出力

最後に、カウント結果を出力します。

int main() {
    char str[] = "Hello123World456";
    int count = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (isdigit(str[i])) {
            count++;
        }
    }
    printf("数字の出現回数: %d\n", count);
    return 0;
}

このコードを実行すると、文字列内の数字の出現回数がカウントされ、結果が表示されます。

実行結果の例

上記のコードを実行すると、以下のような結果が得られます。

数字の出現回数: 6

このようにして、C言語を用いて文字列内の数字の出現回数を簡単にカウントすることができます。

応用例

複数の文字列に対するカウント

複数の文字列に対して数字の出現回数をカウントする場合、基本的なアルゴリズムは変わりませんが、複数の文字列を処理するためのループを追加する必要があります。

以下にその例を示します。

#include <stdio.h>
#include <ctype.h>
int count_digits(const char *str) {
    int count = 0;
    while (*str) {
        if (isdigit(*str)) {
            count++;
        }
        str++;
    }
    return count;
}
int main() {
    const char *strings[] = {
        "Hello123",
        "World456",
        "C789Programming",
        NULL
    };
    for (int i = 0; strings[i] != NULL; i++) {
        int count = count_digits(strings[i]);
        printf("String %d: %d digits\n", i + 1, count);
    }
    return 0;
}

このプログラムでは、count_digits関数を使って各文字列内の数字の出現回数をカウントし、その結果を表示します。

strings配列には複数の文字列が格納されており、NULLで終端されています。

forループを使って各文字列を処理し、結果を出力します。

特定の数字の出現回数をカウントする方法

特定の数字(例えば 3 )の出現回数をカウントする場合、isdigit関数の代わりに特定の文字をチェックする条件を追加します。

以下にその例を示します。

#include <stdio.h>
int count_specific_digit(const char *str, char digit) {
    int count = 0;
    while (*str) {
        if (*str == digit) {
            count++;
        }
        str++;
    }
    return count;
}
int main() {
    const char *str = "Hello123, this is a test 333";
    char digit = '3';
    int count = count_specific_digit(str, digit);
    printf("The digit '%c' appears %d times in the string.\n", digit, count);
    return 0;
}

このプログラムでは、count_specific_digit関数を使って特定の数字の出現回数をカウントします。

strには対象の文字列が格納されており、digitにはカウントしたい数字が格納されています。

whileループを使って文字列を走査し、特定の数字が見つかった場合にカウントを増やします。

結果はprintf関数を使って出力されます。

これらの応用例を通じて、C言語での文字列操作や数字のカウント方法をさらに深く理解することができます。

複数の文字列や特定の数字に対するカウント方法を学ぶことで、より柔軟なプログラムを作成することが可能になります。

よくあるエラーとその対処法

C言語で文字列内の数字の出現回数をカウントする際に、いくつかのよくあるエラーが発生することがあります。

ここでは、そのエラーと対処法について解説します。

入力文字列が空の場合

入力文字列が空の場合、プログラムが正しく動作しないことがあります。

例えば、文字列の長さが0の場合、ループが一度も実行されず、結果が正しく出力されないことがあります。

対処法

入力文字列が空であるかどうかを事前にチェックし、空の場合は適切なメッセージを表示するようにします。

#include <stdio.h>
#include <ctype.h>
int main() {
    char str[100];
    int count = 0;
    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin);
    // 入力文字列が空かどうかをチェック
    if (str[0] == '\n') {
        printf("入力文字列が空です。\n");
        return 1;
    }
    for (int i = 0; str[i] != '\0'; i++) {
        if (isdigit(str[i])) {
            count++;
        }
    }
    printf("数字の出現回数: %d\n", count);
    return 0;
}

非数字文字が含まれる場合

入力文字列に非数字文字が含まれている場合、プログラムが正しく動作しないことがあります。

特に、数字以外の文字をカウントしないようにする必要があります。

対処法

isdigit関数を使用して、文字が数字であるかどうかをチェックします。

これにより、非数字文字を無視してカウントを行うことができます。

#include <stdio.h>
#include <ctype.h>
int main() {
    char str[100];
    int count = 0;
    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin);
    for (int i = 0; str[i] != '\0'; i++) {
        if (isdigit(str[i])) {
            count++;
        }
    }
    printf("数字の出現回数: %d\n", count);
    return 0;
}

メモリ管理の問題

C言語では、メモリ管理が重要です。

特に、動的にメモリを確保する場合、メモリリークやバッファオーバーフローが発生することがあります。

対処法

動的メモリを使用する場合は、malloc関数free関数を適切に使用し、メモリリークを防ぎます。

また、バッファサイズを超えないように注意します。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main() {
    char *str;
    int count = 0;
    size_t size = 100;
    // 動的にメモリを確保
    str = (char *)malloc(size * sizeof(char));
    if (str == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    printf("文字列を入力してください: ");
    fgets(str, size, stdin);
    for (int i = 0; str[i] != '\0'; i++) {
        if (isdigit(str[i])) {
            count++;
        }
    }
    printf("数字の出現回数: %d\n", count);
    // メモリを解放
    free(str);
    return 0;
}

これらの対処法を実践することで、C言語で文字列内の数字の出現回数をカウントする際のよくあるエラーを防ぐことができます。

目次から探す