C言語で文字列内の英字・数字・特殊文字の個数をカウントする方法
はじめに
C言語では、文字列を1文字ずつ走査しながらASCIIコードの範囲で判定することで、文字列に含まれる英字(アルファベット)・数字・特殊文字の個数をそれぞれカウントできます。本記事では、基本となるロジックから完全なサンプルプログラム、実行結果までをわかりやすく解説します。
カウントのロジック
実装するロジックは以下の通りです。for文で文字列の終端(NULL文字 '\0')まで繰り返し処理を行い、各文字をif〜else if文で分類してカウントしていきます。
for(number=0; string[number]!='\0'; number++) { // 文字列の終端までループ
if(string[number]>='a' && string[number]<='z' || string[number]>='A' && string[number]<='Z'){
// 英字(大文字・小文字)の場合
alphabets=alphabets+1; // 英字をカウント
}
else if(string[number]>='0' && string[number]<='9'){
// 数字の場合
digits=digits+1; // 数字をカウント
}
else{
// 英字・数字以外(特殊文字)の場合
special=special+1; // 特殊文字をカウント
}
}ロジックのポイント
- 終端判定:ループ条件
string[number] != '\0'により、文字列の末尾まで確実に走査できます。 - 英字の判定:ASCIIコードでは小文字が 'a'〜'z'、大文字が 'A'〜'Z' の範囲に位置するため、範囲比較だけで判別可能です。
- 数字の判定:文字としての数字は '0'〜'9' の範囲にあります。
- 特殊文字:英字にも数字にも該当しない文字(記号・空白など)はすべて特殊文字としてカウントされます。
サンプルプログラム
次のプログラムは、ユーザーが入力した文字列に含まれる英字・数字・特殊文字の総数を求めて表示します。
#include <stdio.h>
#include <ctype.h>
void main(){
// カウンタ変数と文字列の宣言
int number;
char string[50];
int alphabets=0;
int digits=0;
int special=0;
// ユーザーからの入力を読み込む
printf("Enter the string : ");
gets(string);
for(number=0; string[number]!='\0'; number++){
if(string[number]>='a' && string[number]<='z' || string[number]>='A' && string[number]<='Z'){
alphabets=alphabets+1; // 英字をカウント
}
else if(string[number]>='0' && string[number]<='9'){
digits=digits+1; // 数字をカウント
}
else{
special=special+1; // 特殊文字をカウント
}
}
// 英字・数字・特殊文字の個数を表示
printf("The number of alphabets in the string is : %d\n",alphabets);
printf("The number of digits in the string is : %d\n",digits);
printf("The number of special characters in the string is : %d\n",special);
}注意:gets() 関数はバッファオーバーフローを引き起こす危険があるため、C11規格で廃止されました。実務では fgets(string, sizeof(string), stdin) の使用を強くおすすめします。
実行結果
例として「Tutorialspoint#123」を入力した場合の実行結果は以下の通りです。
Enter the string : Tutorialspoint#123 The number of alphabets in the string is : 14 The number of digits in the string is : 3 The number of special characters in the string is : 1
応用:ctype.h の標準関数を活用する
サンプルコードでインクルードしている ctype.h には、文字分類のための便利な関数が用意されています。isalpha() や isdigit() を使えば、判定処理をより簡潔で可読性の高いコードにできます。
if(isalpha(string[number])){
alphabets++; // 英字をカウント
}
else if(isdigit(string[number])){
digits++; // 数字をカウント
}
else{
special++; // 特殊文字をカウント
}まとめ
文字列の走査とASCIIコードによる範囲比較(または ctype.h の標準関数)を組み合わせることで、英字・数字・特殊文字の個数を簡単に集計できます。文字列処理の基礎となるテクニックなので、ぜひマスターしておきましょう。
-
C言語で文字列⇔数値の相互変換を行う方法|sscanf関数とsprintf関数の使い方
はじめにC言語のプログラミングにおいて、「文字列から数値への変換」および「数値から文字列への変換」とは何を意味するのでしょうか?本記事では、標準ライブラリ関数を使った双方向の変換方法を、構文・サンプルコード・実行結果とあわせて解説します。解決策:使用する2つの関数C言語には、この変換を実現するための関数が用意されています。sscanf() ― 文字列を数値に変換するsprintf() ― 数値を文字列に変換する文字列から数値への変換(sscanf)sscanf()関数を使うことで、文字列として格納されたデータを、書式指定子に従って解析し、数値として各変数に読み込むことができます。scanf()
-
Pythonで数値の各桁に対応する文字から生成できるすべての文字列を求める方法
ここでは、1から9までの各数字が複数の文字に対応付けられた「文字マッピング」を扱います。次のようなマッピングを考えてみましょう。1 -> [A, B, C] 2 -> [D, E, F] 3 -> [G, H, I] 4 -> [J, K, L] 5 -> [M, N, O] 6 -> [P, Q, R] 7 -> [S, T, U] 8 -> [V, W, X] 9 -> [Y, Z]問題の概要ある数値が与えられたとき、その各桁をマッピング表内の対応する文字に置き換えて、生成されるすべての文字列を表示します。ただし、重要なルールとして同じ