🔤 文字列
🎯 文字が数値であることを理解し、文字コードを使った計算ができる
コンピュータは数値しか扱えません。ではなぜ文字を表示できるのか。答えは単純で、文字にも番号が振ってあるからです。「A は65番」という対応表があり、その代表が ASCII です。
#include <stdio.h>
int main(void)
{
char c = 'A';
printf("%c\n", c); // A ← 文字として表示
printf("%d\n", c); // 65 ← 数値として表示
return 0;
}同じ変数を %c で見れば文字、%d で見れば数値。char は「1バイトの小さな整数型」であり、文字はその値の解釈にすぎません。
覚えておくと得をする番号
| 文字 | 値 |
|---|---|
'0' 〜 '9' | 48 〜 57 |
'A' 〜 'Z' | 65 〜 90 |
'a' 〜 'z' | 97 〜 122 |
ここで大事なのは、連続して並んでいることと、大文字と小文字がちょうど32違うことです。この2つの性質から、便利な計算が生まれます。
#include <stdio.h>
int main(void)
{
char d = '7';
printf("%d\n", d - '0'); // 7 ← 文字の数字を数値に変換
printf("%c\n", 'a' - 32); // A ← 小文字を大文字に
printf("%d\n", 'z' - 'a' + 1); // 26 ← アルファベットの数
return 0;
}d - '0' は暗記して構いません。文字 '7'(55)から '0'(48)を引くと 7。文字で入力された数字を計算に使うときの定番です。逆に、数値 7 を文字にしたければ 7 + '0' とします。
表そのものを丸暗記する必要はありません。覚えておくべきは「連続して並んでいる」「大文字と小文字は32違う」「数字は '0' から始まる」の3点だけ。具体的な値が必要になったら printf("%d\n", 'A'); で調べればすみます。
日本語はどうなっているのか
ASCIIは英数字と記号だけの表で、127番までしかありません。日本語を表すには足りないので、現在は UTF-8 という方式が広く使われています。UTF-8では、英数字は1バイトのまま、日本語のほとんどは3バイトで表されます。
printf("%zu\n", strlen("abc")); // 3
printf("%zu\n", strlen("あいう")); // 9(3文字 × 3バイト)strlen が数えているのはバイト数であって文字数ではありません。ここから重要な結論が出ます。
s[0] でアクセスしても、1文字は取り出せません(3バイトのうち先頭1バイトだけ)Cで日本語を1文字ずつ正確に扱うには専用の処理が必要です。初学の段階では「日本語は表示だけ、加工は英数字で」と割り切って進めるのが安全です。文字列をそのまま printf に渡して表示するぶんには、日本語でも何も問題ありません。
罠・注意
'1' と 1 は別物です。'1' は値49の文字、1 は数値。混ぜると意味不明な結果になります。if (c == 65) より if (c == 'A') のほうが読みやすく、移植性もあります。char が符号付きか符号なしかは環境によって異なります。128以上の値を扱うときは注意が必要ですが、これは第6部で扱います。まとめ: 文字は数値。'A' は65、'0' は48で、それぞれ連続して並んでいます。c - '0' は定番、日本語はUTF-8で複数バイトです。
値を入れておくための名前付きの箱のこと。名前をつけることで中身を自由に出し入れできる、プログラムの記憶場所にあたる。変数名は自由に付けられるが、意味の分かる名前にすると読みやすいコードになる。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。