文字列: 文字の配列

C言語にString型はない。「ヌル文字」が支配する世界。

ヌル終端文字
文字列の終わりを表す特殊文字。数値の0。
文字列リテラル
"..." で囲まれた文字データ。書き換えできない領域に置かれることが多い。
列車の終端標識 (End-of-Train Sign)

C言語の文字列は「列車」のようなものです。各車両(char)に一文字ずつ乗っています。そして一番大事なのが、最後尾にある「終端標識(ヌル文字)」です。もしこれを付け忘れると、駅員さん(printf)は列車がどこで終わるのか分からず、線路が続く限り(メモリの果てまで)走り続けてしまいます(暴走)。

String型は幻

C言語に String という型は存在しません。あるのは「文字(char )が並んだ配列」だけです。

しかし、配列だけでは「どこで文字が終わるか」が分かりません。そこでC言語は 「ヌル文字が出たらそこで終了」 というルールを定めました。これは絶対の掟です。

"ABC" という文字列は、メモリ上では A, B, C, ヌル という4バイトのデータとして存在します。

ヌル終端文字の恐怖

ヌル文字を入れるスペースを忘れると、プログラムは「終わり」を見つけられず、メモリの彼方まで読み進んでしまいます。

Common Bug
// そもそも "文字列型" がない
char name[5] = "Alice";
// ['A', 'l', 'i', 'c', 'e'] ... あれ?終端は?
// 表示しようとすると...
printf("%s", name);
// "Alice烫烫烫烫..." (ゴミデータが表示される、またはクラッシュ)
Correct Usage
// ✅ 正しい文字列宣言
// 方法1: 十分なサイズを確保
char name1[6] = "Alice"; // 5 chars + null terminator
// 方法2: コンパイラに任せる(推奨)
char name2[] = "Alice"; // 自動でサイズ6になる
// 方法3: ポインタ(定数文字列)
const char *name3 = "Alice"; // 書き換え不可

実践テクニック

書き換え不可の文字列

char *s = "Hello"; と書いた場合、この "Hello" は書き換えできないメモリ領域に置かれることが多いです。s[0] = 'h'; とするとクラッシュします。変更したい場合は必ず配列として宣言してください( char s[] = "Hello";)。

演習課題

課題1: 一文字表示
自分の名前を配列に入れ、ループを使って1文字ずつ改行して表示してください。ヌル文字までループする条件式を書いてみましょう。

合格ライン

文字列の最後に必ずヌル文字が必要だと知っている
5文字の単語には最低6バイト必要だと即答できる