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 で、ab の文字コードの和を計算する。
char 型同士の加算も、char 型と整数型の加算もでき、結果は整数型になる。

減算 -

a-b で、ab の文字コードの差を計算する。
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文で全ての文字を順に処理できる。