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が無いと文字列は正しく動かない