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

C言語で文字列内の大文字・小文字・数字・空白・特殊文字を数える方法

C言語では、文字列を1文字ずつ走査しながら条件分岐を行うことで、大文字・小文字・数字・空白・特殊文字のそれぞれの出現回数を簡単にカウントできます。この記事では、その基本的な実装方法をサンプルコードとともに解説します。

文字種をカウントするC言語プログラム

以下のプログラムは、ユーザーが入力した文字列を解析し、大文字・小文字・数字・空白・特殊文字の個数をそれぞれ集計して表示します。

#include <stdio.h>

int main(void) {
    char str[100];
    int i;
    int upper = 0, lower = 0, number = 0, special = 0, whitesp = 0;

    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin);

    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] >= 'A' && str[i] <= 'Z')
            upper++;      /* 大文字 */
        else if (str[i] >= 'a' && str[i] <= 'z')
            lower++;      /* 小文字 */
        else if (str[i] >= '0' && str[i] <= '9')
            number++;     /* 数字 */
        else if (str[i] == ' ')
            whitesp++;    /* 空白 */
        else
            special++;    /* 特殊文字 */
    }

    printf("大文字の数: %d\n", upper);
    printf("小文字の数: %d\n", lower);
    printf("数字の数: %d\n", number);
    printf("空白の数: %d\n", whitesp);
    printf("特殊文字の数: %d\n", special);

    return 0;
}

コードの解説

1. 文字の判定方法
各文字はASCIIコードの値として比較されます。'A'〜'Z'には65〜90、'a'〜'z'には97〜122、'0'〜'9'には48〜57という連続したコードが割り当てられているため、範囲比較(>= と <=)だけで文字種を判別できます。

2. ループ処理
for文で文字列の先頭から終端のヌル文字('\0')まで1文字ずつ走査し、if〜else if文の連鎖によって該当するカテゴリのカウンタを増やしていきます。どの条件にも一致しなかった文字は、特殊文字としてカウントされます。

実行例

「Hello World! 123」と入力した場合の出力は次のとおりです。

大文字の数: 2
小文字の数: 8
数字の数: 3
空白の数: 2
特殊文字の数: 1

注意点:gets() の使用について

元のコードでは入力に gets() 関数が使われていますが、この関数はバッファサイズをチェックしないためバッファオーバーフローの危険があり、C11規格で廃止されました。代わりに fgets() を使用すれば、安全に入力を受け取ることができます。また、ループ変数は char 型ではなく int 型で宣言するのが一般的です。なお、fgets() は末尾の改行文字も読み込むため、厳密にカウントしたい場合は strcspn() などで改行を取り除いてください。

このように、ASCIIコードの範囲比較と条件分岐を組み合わせることで、文字列内の各文字種をシンプルに集計できます。さらに ctype.h の isupper() や isdigit() といった標準ライブラリ関数を活用すれば、より可読性の高いコードに仕上げることも可能です。

  1. C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方

    はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()

  2. Pythonで文字列の小文字と大文字が同じ順序かどうかを判定する方法

    問題の概要 ここでは、アルファベットの大文字と小文字のみで構成された文字列 s を考えます(数字は含まれないものとします)。この文字列に対して、小文字が出現する順序と大文字が出現する順序がそれぞれ一致しているかどうかを判定します。つまり、ある文字が小文字として複数回現れる場合、その文字が大文字としても同じ回数、同じ相対的な位置関係で現れていなければなりません。 たとえば、入力が s = piPpIePE の場合、出力は True になります。小文字だけを抜き出すと pipe、大文字だけを抜き出すと PIPE となり、小文字部分を大文字に変換した結果が大文字部分と完全に一致するためです。 解決の