C言語

文字列と配列

C言語には「文字列型」という専用の型はありません。
その代わりに、文字(char型)を並べた配列を使って文字列を表現します。

今回は、文字列と配列の関係、文字列の初期化、出力・入力方法、そして文字列を扱ううえで欠かせない「終端文字 \0」について解説します。

文字列とは

C言語の文字列は、次のように char型の配列 として管理されます。

「Hello」という文字列をchar型の配列には次のように格納されます。

char str[6];

str[0] = 'H';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '\0';

ポイントは、最後の \0(ヌル文字)です。
これは「ここで文字列が終わりです」という印です。

つまり、C言語では
「\0 があるところまでが文字列」
というルールになっています。

このため、"Hello"は、5文字なので、str[5] と要素数を 5 にしがちですが、
\0 があるため、文字列の長さ+1個の要素が必要となります。

終端文字 \0 の重要性
C言語の文字列処理はすべて \0 を目印にして動きます。
もし \0 が無い文字列を printf で表示すると、メモリ上にある別のデータまで読み込んでしまい、予期しない文字列が表示されたり、動作が不安定になります。

文字列の宣言と初期化

配列の初期化と同様に、宣言と同時に文字列を初期化することができます。
文字列の初期化には、次の2つの方法があります。

char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 1文字ずつ文字を指定して初期化
char str[6] = "Hello";                         // 文字列リテラルで初期化(こちらが一般的)

1文字ずつ文字を指定して初期化する場合は、明示的に \0 を記述する必要があるのに対して、文字列リテラルの場合は、コンパイラが自動的に \0 を付けてくれます。

文字列リテラルとは
コードの中に、ダブルクォーテーション " " で直接書かれた文字列のことを文字列リテラルといいます。

文字列を出力する方法

文字列を表示するときは、printf%s を使います。
printf は、文字列が終端文字 \0 に到達するまで表示します。
実際に配列に格納した文字列を出力してみましょう。

#include <stdio.h>

int main(void)
{
  char str[6] = "Hello";
  
  printf("文字列は、「%s」です。\n", str);

  return 0;
}

実行結果は次の通りです。

文字列は「Hello」です。

文字列の入力方法(scanf)

キーボードから文字列を入力するには、次のように書きます。

#include <stdio.h>

int main(void)
{
  char str[256];
  
  printf("文字列を入力してください。\n");
  
  scanf("%s", str);
  
  printf("入力した文字列は、「%s」です。\n", str);

  return 0;
}

1文字と文字列の違い

1文字と文字列とでは書き方に違いがあります。
1文字は、文字をシングルコーテーションで囲います。
文字列は、文字をダブルクォーテーションで囲います。
違いを表でまとめると次のようになります。

書き方意味中身
'A'1文字のchar型数値(ASCIIコード)を1つだけ保持
"A"文字列{'A', '\0'} の2文字

まとめ

  • C言語の文字列は「char 配列」で表される
  • 文字列の最後には必ず終端文字 \0 が必要
  • "Hello" と書くと、自動で \0 付きの配列が作られる
  • %s を使えば文字列を出力できる
  • scanf("%s") は空白で区切られ、長すぎる入力は危険
  • 'A'(1文字)と "A"(文字列)は異なる
  • \0 が無いと文字列は正しく動かない

-C言語