C++で文字列内の大文字・小文字・特殊文字・数字の出現回数をカウントする方法
文字列には、大文字・小文字のアルファベットだけでなく、特殊文字や数値が含まれている場合があります。本記事では、文字列内に含まれる各種文字(大文字・小文字)、特殊文字、数値の出現回数をそれぞれ集計する方法を解説します。
各文字の分類とASCIIコード
大文字:A〜Z。ASCIIコードは65〜90の範囲(65と90を含む)です。
小文字:a〜z。ASCIIコードは97〜122の範囲(97と122を含む)です。
数値:0〜9。ASCIIコードは48〜57の範囲(48と57を含む)です。
特殊文字:!、@、#、$、%、^、&、* など
入力例と出力例
入力:str = Tutori@lPo!n&90
出力:
- 文字列内の大文字の合計数:2
- 文字列内の小文字の合計数:8
- 文字列内の数字の合計数:2
- 文字列内の特殊文字の合計数:3
入力:str = WELc0m$
出力:
- 文字列内の大文字の合計数:3
- 文字列内の小文字の合計数:2
- 文字列内の数字の合計数:1
- 文字列内の特殊文字の合計数:1
プログラムのアルゴリズム
- 大文字、小文字、特殊文字、数値を含む文字列を入力として受け取ります。
- 文字列の長さを取得します。
- 大文字・小文字・特殊文字・数値それぞれのカウント用変数を用意し、すべて0で初期化します。
- 0から文字列の長さまでforループを回します。
- ループ内で、str[i]が「'A'以上かつ'Z'以下」であれば大文字のカウントをインクリメントします。
- str[i]が「'a'以上かつ'z'以下」であれば小文字のカウントをインクリメントします。
- str[i]が「'0'以上かつ'9'以下」であれば数字のカウントをインクリメントします。
- いずれの条件にも該当しない場合は、特殊文字のカウントをインクリメントします。
- 最後に結果を出力します。
C++サンプルコード
#include<iostream>
using namespace std;
//大文字・小文字・特殊文字・数値をカウントする関数
void count(string str){
int Uppercase = 0;
int Lowercase = 0;
int digit = 0;
int special_character = 0;
for (int i = 0; i < str.length(); i++){
if (str[i] >= 'A' && str[i] <= 'Z'){
Uppercase++;
}
else if(str[i] >= 'a' && str[i] <= 'z'){
Lowercase++;
}
else if(str[i]>= '0' && str[i]<= '9'){
digit++;
}
else{
special_character++;
}
}
cout<<"文字列内の大文字の合計数: "<<Uppercase<< endl;
cout<<"文字列内の小文字の合計数: "<<Lowercase<< endl;
cout<<"文字列内の数字の合計数: "<<digit<< endl;
cout<<"文字列内の特殊文字の合計数: "<<special_character<< endl;
}
int main(){
string str = "Tutori@lPo!n&90";
count(str);
return 0;
}
実行結果
上記のコードを実行すると、以下のような出力が得られます。
文字列内の大文字の合計数: 2 文字列内の小文字の合計数: 8 文字列内の数字の合計数: 2 文字列内の特殊文字の合計数: 3
まとめ
このように、ASCIIコードの範囲を使った条件分岐により、文字列中の文字種を簡単に判別できます。if-else文を順番に評価していくシンプルな実装であり、時間計算量は文字列の長さをNとするとO(N)になります。パスワードの強度チェックなど、文字種ごとの集計が必要な場面で応用できる基本的なテクニックです。
-
C/C++におけるstrncmp()とstrcmp()の違いを徹底解説
strncmp()とはstrncmp()は、指定された文字数まで左側の文字列と右側の文字列を比較するための関数です。基本的な動作はstrcmp()と同じですが、「比較する最大文字数」を引数で指定できる点が大きな特徴です。戻り値は以下のように決まります。比較した位置の文字同士がすべて等しい場合(または指定文字数内で差が出なかった場合):0左側の文字列の文字が、右側の対応する文字より大きいASCII値を持つ場合:0より大きい値左側の文字列の文字が、右側の対応する文字より小さいASCII値を持つ場合:0より小さい値C言語におけるstrncmp()の構文は次のとおりです。int strncmp(con
-
C++の文字リテラルと文字列リテラルの違いをわかりやすく解説
C++における文字リテラルと文字列リテラルの基本C++では、シングルクォート( )で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば a は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。一方、ダブルクォート( )で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。具体的な違いのポイント文字リテラル: 原則として1文字のみを格納する