この記事は今後修正の予定があります。ご了承ください。
背景
大文字と小文字をさくっと入れ替えたい。
文字列に大文字が含まれているかさくっと判別したい。
そんなときにさくっと使える関数があるといいなと思い、作りました。
作った関数
bool capital_judge(const char c)
入力した文字が大文字か小文字かを判定します。
入力 | return |
---|---|
A〜Z | true |
a〜z | false |
それ以外 | プログラム終了 |
/* 関数名 capital_judge(const char c)
説明 入力が大文字なら true, 小文字なら false を返す
使用ライブラリ なし
制約事項 入力が大文字、小文字のどちらでもなければプログラムを終了させます。
*/
bool capital_judge(const char c){
if('a'<=c && c<='z') return false;
else if('A'<=c && c<='Z') return true;
else std::exit(0);
}
bool str_cap_judge(const string str)
文字列に大文字が含まれているかどうかを判定します。
入力 | return |
---|---|
A〜Z を 1 つ以上含む | true |
A〜Z を 1 つも含まない | false |
A〜Z、a〜z 以外の文字を1つでも含む | プログラム終了 |
A〜Z を 1 つ以上含み、かつ A〜Z、a〜z 以外の文字を 1 つでも含む場合はプログラム終了が優先されます。
/* 関数名 str_cap_judge(const string str)
説明 入力文字列に大文字が含まれていれば true, 含まれていなければ false を返す
使用ライブラリ string
制約事項 入力にアルファベット以外の文字が含まれていた場合は、プログラムを終了させます。
*/
bool str_cap_judge(const string str){
for(int i=0; i<str.length(); i++){
if('A'<=str[i] && str[i]<='Z') return true;
else if(str[i]<'a' || 'z'<str[i]) std::exit(0);
}
return false;
}
char capital_conv(const char c)
入力がした文字が大文字なら小文字に、小文字なら大文字にして返します。
入力 | return |
---|---|
A〜Z | a〜z |
a〜z | A〜Z |
それ以外 | プログラム終了 |
/* 関数名 capital_conv(const char c)
説明 入力が大文字なら小文字に、小文字なら大文字に変換します。
使用ライブラリ なし
制約事項 入力が大文字、小文字のどちらでもなければプログラムを終了させます。
*/
char capital_conv(const char c){
if('a'<=c && c<='z') return c-32;
else if('A'<=c && c<='Z') return c+32;
else std::exit(0);
}
コード中の32
という定数は、ASCIIコードにおける大文字と小文字の差です。
ASCII - Wikipedia
https://ja.wikipedia.org/wiki/ASCII
'A' のアスキー値が 65、'a' のアスキー値が 97 なので、ちょうどこの差の 32 を足し引きすることで大文字と小文字を変換できます。
string str_cap_conv(const string str)
文字列の大文字と小文字を入れ替えます。
アルファベット以外の文字は、そのままにします。
入力例 | return |
---|---|
AbCdEFgh | aBcDefGH |
A1b!C@d9 | a1B!c@D9 |
/* 関数名 str_cap_conv(const string str)
説明 文字列の大文字と小文字を入れ替えます
使用ライブラリ string
制約事項 アルファベット以外の文字に対しては何もしません
*/
string str_cap_conv(string str){
for(int i=0; i<str.length(); i++){
if('a'<=str[i] && str[i]<='z') str[i] -= 32;
else if('A'<=str[i] && str[i]<='Z') str[i] += 32;
}
return str;
}
定数 32 の意味は先程と同じです。
使い方
こんな感じで使います。
# include<iostream>
# include<string>
using namespace std;
bool capital_judge(const char c);
bool str_cap_judge(const string str);
char capital_conv(const char c);
string str_cap_conv(string str);
int main(){
char c1 = 'A', c2 = 'a';
string str1 = "aBc", str2 = "abc";
cout << capital_judge(c1) << ", " << capital_judge(c2) << endl;
cout << str_cap_judge(str1) << ", " << str_cap_judge(str2) << endl;
cout << capital_conv(c1) << ", " << capital_conv(c2) << endl;
cout << str_cap_conv(str1) << ", " << str_cap_conv(str2) << endl;
return 0;
}
1, 0
1, 0
a, A
AbC, ABC
まとめ
大文字と小文字の変換や抽出は、ASCII値で処理してしまえば簡単ですね。
少し改変するだけで文字列から大文字or小文字のみを抽出したり、アルファベットと数字以外のときにエラー文字or文字列をリターンしたり無視したり、簡単に拡張できそうです。