背景
C++ であるデータ型(文字列型や整数型)で表現された数値情報をそのままの出力を保ったまま型を変換したい時のやり方をいつも忘れてしまうため、忘備録として記録する。
併せてこれまた忘れがちな、文字コード周りの変換についても記載する。
TL;DR
- 文字の
'1'
を数値の1
に変換するときは、-48
する(逆の場合は+48
)。-
-'0'(+'0')
する方がわかりやすい
-
- 文字列の
'123'
を数値の123
に変換するときは、stoi
を使用する(逆の場合はto_string
)。 - アルファベット文字の
A
の文字コード(65
)を得るには char 型から int 型にキャストする。 - アルファベット文字や数値に対して、あるアルファベット(e.g.
a
)からのオフセットを求めるには、-'a'
する(逆の場合は+'a'
)。
実例
1. 文字型(char
)数字<->整数型(int
)数字間の相互変換
char の「'7'」を int の「7」に変更したいとき:
char c = '7';
int i = c - 48;
int j = c - '0';
cout << i << ", " << j; // 7, 7
int の「7」を char の「'7'」に変更したいとき:
int i = 7;
char c1 = i + 48;
char c2 = i + '0';
cout << c1 << ", " << c2; // '7', '7'
2. 文字列型(string
)数字<->整数型(int
)数字間の相互変換
string の「'31415'」を int の「31415」に変更したいとき:
string s = "31415";
int i = stoi(s);
cout << i; // 31415
int の「31415」を string の「'31415'」に変更したいとき:
int i = 31415;
string s = to_string(i);
cout << s; // "31415"
3. アルファベットの文字 <-> 文字コード間の相互変換
Y
の文字コードを得たいとき:
char c = 'Y';
int i = c;
cout << i; // 89
文字コードが 89
のアルファベットを得たいとき:
int i = 89;
char c = i;
cout << c; // 'Y'
大文字アルファベットのうち、'A' から始めて一つおきのアルファベットを得たいとき:
char c = 'A';
for(int i = c; i < c + 26; i++) {
if((i - c) % 2 == 0) {
cout << char(i) << endl; // 'A', 'C', 'E'..
}
}
x
が a
から数えて何番目のアルファベットかを得たいとき:
char c = 'x';
int i = c - 97;
int j = c - 'a';
cout << i << ", " << j << endl; // 23, 23
a
から 23
番目のアルファベットを得たいとき:
int i = 23;
char c1 = i + 97;
char c2 = i + 'a';
cout << c1 << ", " << c2 << endl; // 'x', 'x'
感想
こんな風にまとめてもすぐに忘れやすい。
JavaScript のように、コンストラクタでまるっと変換できたり、明示的な変換用の関数があった方が覚えやすいのになぁ。