char型
概要
文字を $1$ 文字だけ扱う型。
$2$ 文字以上をまとめて扱いたい場合は、string 型を利用する。
文字リテラルをシングルクォーテーション ' で囲むと、char 型として扱われる。
'A'
AtCoder環境では、char 型は $8$ ビットの整数型として文字コードを保持する。
例えば、ASCIIコードでは '0' は 48、'A' は 65、'a' は 97 である。
実際の番号を覚える必要はほぼない。
'0' から '9'、'A' から 'Z'、'a' から 'z' がそれぞれ連続していると認識しておけばよい。
特に、文字 '0' の文字コードは数値の 0 ではないことに注意。
宣言と初期化
宣言だけする場合
char c;
初期化もする場合
char c = 'A'; // 固定値で初期化
char d = c; // 他の整数型や char 型の変数で初期化
整数型の値で初期化した場合、その文字コードに対応する文字になる。
可能な演算
代入 =
a=b; で、変数 a の中身を b に書き換える。
数学とは違い、左右を逆にして b=a; と書くと意味が変わるので注意。
整数型の値を代入した場合、その文字コードに対応する文字になる。
加算 +
a+b で、a と b の文字コードの和を計算する。
char 型同士の加算も、char 型と整数型の加算もでき、結果は整数型になる。
減算 -
a-b で、a と b の文字コードの差を計算する。
char 型同士の減算も、char 型と整数型の減算もでき、結果は整数型になる。
各種複合代入演算子
char 型では、+=、-=、および ++、-- が使える。
よく使う処理
int 型化(B問題相当)
ASCIIコード上で '0' から '9' までが連続していることを利用できる。
数字を表す char 型の文字 c を、0 以上 9 以下の整数に変換する場合は、以下のようにする。
c-'0'
逆に、0 以上 9 以下の整数 a を、その数字を表す char 型へ変換する場合は、以下のようにする。
これを cout する場合は、一度 char 型の変数に入れた方がよい。
a+'0'
文字種判定
isupper(c) で英大文字、islower(c) で英小文字、isdigit(c) で数字かどうかを判定できる。
isupper(c)
islower(c)
isdigit(c)
自分で条件を書く場合は、例えば英大文字を次のように判定できる。
'A'<=c && c<='Z'
大文字小文字変換
英大文字の c を対応する英小文字へ変換する場合は、以下のようにする。
c += 'a'-'A';
英小文字の c を対応する英大文字へ変換する場合は、以下のようにする。
c += 'A'-'a';
次の文字、前の文字
文字コードが連続している範囲では、++ で次の文字、-- で前の文字にできる。
例えば、以下のように書けば、全ての英小文字についてループできる。
for (char c='a'; c<='z'; c++)
string 型の範囲for文(B問題相当)
string 型の全ての文字について処理する場合は、次のように範囲for文を書ける。
for (char c : s)
注意点
数値と数字を表す文字の違いに注意
数値の 8 と、数字を表す文字の '8' は別の値である。
char 型の文字と比較する場合は、シングルクォーテーションで囲むこと。
if (c=='8')
また、'A' は char 型だが、"A" は文字列を表すため、同じものではない。
関連アルゴリズム
int型
最も代表的な整数型。
数字を表す文字との相互変換や、文字コードを用いた計算で関係する。
string型
文字列を扱う型。
各文字を取り出すと char 型になり、範囲for文で全ての文字を順に処理できる。