文字列(char配列)
C に文字列型はない
ここまで扱ってきた点数は数値でしたが、成績管理には学生の名前も要ります。ところが C には、文字列を入れるための専用の型がありません。
C の文字列は char の配列 です。1文字ぶんの型である char を並べて、そこに1文字ずつ入れます。
char name[20] = "Sato";
printf("%s\n", name); // Satochar name[20] は char を20個ぶん確保します。ダブルクォートで書いた "Sato" は、先頭から S, a, t, o と入れてくれます。表示は %s という書式で、配列の名前をそのまま渡します。
なお、日本語の名前を char 配列に入れると、1文字が複数の char を使うため、文字数の数え方がややこしくなります。この章では名前をローマ字で扱います。
終端記号 \0 が入っている
"Sato" は4文字ですが、実際に使われる箱は5個です。4文字目の後ろに 終端記号 '\0' (ヌル文字) が自動で入るからです。
添字 0 1 2 3 4 5 ...
中身 S a t o \0 不明なぜこれが要るかというと、printf("%s", name) は「配列が何文字ぶん使われているか」を知らないからです。渡されるのは配列の先頭だけなので、printf は先頭から1文字ずつ出していき、'\0' に当たったところで止まります。この目印がないと、配列の外まで延々と出力し続けてしまいます。
ですから、n 文字の名前を入れたいなら、配列は最低でも n + 1 個必要です。char name[4] = "Sato"; は終端記号のぶんが足りず、危険なコードになります。
1文字ずつ取り出せる
配列なので、添字で1文字ずつ触れます。1文字は char なので、書式は %c です。
printf("%c\n", name[0]); // S
name[0] = 'T'; // Tato に書き換わる1文字は 'S' のようにシングルクォートで、文字列は "Sato" のようにダブルクォートで書きます。似ていますが別物で、"S" は S と '\0' の2個ぶんの配列です。
終端記号の性質を使うと、文字数も自分で数えられます。
int len = 0;
while (name[len] != '\0') {
len++;
}'\0' に当たるまで添字を進めるだけです。次回学ぶ strlen も、中でやっていることはこれと同じです。
では、名前を char 配列で持ってみましょう。
要件
- char の配列 name に Sato を入れる
- 名前はSatoです の形で名前を表示する
- 1文字目はSです の形で先頭の1文字を表示する
- 文字数は4文字です の形で表示する。文字数は while で数える
入出力例
main("") → "名前はSatoです
1文字目はSです
文字数は4文字です"