C言語基礎|空文字列

「文字がなくても意味がある ― C言語の文字列はナル文字から始まる」

文字列と聞くと、文字が並んでいるものを思い浮かべがちですが、
C言語では 文字が1つもない文字列 も、きちんと意味を持つ存在です。

そのような文字列を 空文字列 と呼びます。
見た目は何もありませんが、内部では「文字列として成立するための最低限のルール」を守っています。

ここでは、

  • 空文字列の正体
  • 配列との関係
  • 入力処理での注意点

を、図や表を使いながら丁寧に見ていきましょう。

空文字列とは何か

空文字列とは、
文字数が 0 個の文字列 のことです。

ただし、C言語の文字列には大切な約束があります。

文字列は、必ずナル文字で終わる

この約束のおかげで、空文字列であっても、
ナル文字 1 個だけ は必ず存在します。

空文字列を格納する配列

次の宣言を見てみましょう。

char ns[] = "";

これは「空文字列を格納する配列」です。
要素数は 0 ではなく 1 になります。

内部の状態

添字中身
0'\0'

つまり、次の宣言と完全に同じ意味です。

char ns[1] = {'\0'};

図で見る空文字列

図のイメージ

空文字列は
「何も入っていない」のではなく、「終わりだけが入っている」
という点がとても重要です。

文字列と文字数の関係

内容見かけの文字数配列に必要な要素数
"ABC"34
""01

文字数 + 1(ナル文字)
これが、文字列を扱うときの基本ルールです。

文字列の読み込みと空文字列

ここからは、文字列の読み込みについて見ていきましょう。

サンプルプログラム

入力された単語を表示する、シンプルな例です。

プロジェクト名:chap9-4-1 ソースファイル名:chap9-4-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    char word[32];

    printf("好きな言葉を入力してください:");
    scanf("%s", word);

    printf("入力された言葉は「%s」です。\n", word);

    return 0;
}

実行例

好きな言葉を入力してください:Hello
入力された言葉は「Hello」です。

scanf と文字列の仕組み

scanf を使って文字列を読み込むときのポイントを整理します。

scanf の書式

int scanf(const char *format, ...);

%s の意味

指定子意味
%s空白までの文字列を読み込む

scanf が内部で行うこと

  1. キーボードから文字を順に読み込む。
  2. 配列に1文字ずつ格納する。
  3. 最後にナル文字を自動で追加する。

この動作のおかげで、
私たちはナル文字を意識せずに文字列を扱えます。

配列名に & を付けてはいけない理由

次の書き方は 誤り です。

scanf("%s", &word);

理由はシンプルです。

  • 配列名そのものが、先頭要素のアドレスを表す。
  • 余計な & を付けると、型が合わなくなる。

正しい書き方

scanf("%s", word);

入力サイズと空文字列の関係

配列の要素数が 32 の場合、

  • 入力できる文字数は最大 31
  • 最後の 1 文字はナル文字用

もし何も入力されなければ、
配列には 空文字列 が格納される可能性もあります。

空文字列は「状態」を表す

空文字列は、次のような意味を表すのに便利です。

状態表現
まだ入力されていない空文字列
初期状態空文字列
内容がない空文字列

単なる「何もない」ではなく、
明確な意味を持つ状態 として使えるのがポイントです。

演習問題

演習9-2

次のように宣言された文字列 s を、
空文字列にする操作を示してください。

char s[] = "ABC";

解答例

s[0] = '\0';

解説

  • 文字列は、最初のナル文字までが有効
  • 先頭にナル文字を置けば、文字数は 0 になる。
  • 配列のサイズは変わらないが、内容は空文字列になる。

この方法は、とてもよく使われます。

まとめ

  • 空文字列は、文字数 0 の文字列
  • 実体は「ナル文字だけの配列」
  • 文字列の終端は必ずナル文字
  • 配列とセットで考えることが大切
  • 入力処理でも空文字列は自然に登場する。