文字列(char配列)

C に文字列型はない

ここまで扱ってきた点数は数値でしたが、成績管理には学生の名前も要ります。ところが C には、文字列を入れるための専用の型がありません。

C の文字列は char の配列 です。1文字ぶんの型である char を並べて、そこに1文字ずつ入れます。

char name[20] = "Sato"; printf("%s\n", name); // Sato

char 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 配列で持ってみましょう。

要件

  1. char の配列 name に Sato を入れる
  2. 名前はSatoです の形で名前を表示する
  3. 1文字目はSです の形で先頭の1文字を表示する
  4. 文字数は4文字です の形で表示する。文字数は while で数える

入出力例

main("") → "名前はSatoです 1文字目はSです 文字数は4文字です"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

文字列(char配列)

⌘S で保存