cppdriveロゴ

文字列と配列

広告

C言語において文字は'a'や'B'などのアルファベットの1文字で表されるものです。文字は文字コードと呼ばれる数値がそれぞれの文字に割り当てられており、文字を格納する場合は「char」型の変数を使用することで可能でした。

文字列と言うのは複数の文字が連続したものです。具体的には「Hello」など複数の文字を連続してつなげることで一つの文字列となります。

他のプログラミング言語においては文字列を扱うためのデータ型が別途用意されていますがC言語では文字列を格納するためのデータ型はありません。そこで文字列を格納する場合には、文字列が複数の文字が連続したものであることから「char」型の配列を使って一つ一つの文字に分解して配列の各要素に格納するようにします。

文字列をchar型の配列に格納

例えば「Hello」と言う文字列をchar型の配列に格納してみます。「Hello」は5文字ですので要素数5の配列を利用します。

char str[5];

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

一見するとこれで問題無いように思われますが、これは文字列ではなくchar型の配列です。文字数が分かっていて順番に出力するようなプログラムであればこれでいいのですが、今後出てくる文字列に対する関数を利用する場合には配列に格納されている文字のどこまでが1つの文字列なのかを分かるようにしなければなりません。

そこで文字列として利用する場合は最後に0を格納する規則になっています。数値の0をそのまま入れても構いませんが、文字列の最後ということが分かりやすいように文字コードとして0が割り当てられている「¥0」を代わりに使用するのが慣例です。(¥0はNULL文字と呼ばれています)。

char str[6];

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

このように配列の要素数は最低でも文字数+1文字が必要となります。逆に文字数+1文字分だけ確保されていればより大きな要素数の配列に対して文字を格納しても構いません。

char str[20];

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

配列の要素数は20ですが、文字列として利用する時には配列の要素数ではなく「¥0」が現れるまでを1つの文字列として扱うためです。逆に要素数が少ない場合、C言語ではエラーではなく確保されていない領域に文字を書き込んでしまいますので注意が必要です。

サンプルプログラム

では簡単なサンプルプログラムを作成して試してみます。

test1-1.c

#include <stdio.h>

int main(void){
  char str[6];

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

  printf("%s¥n", str);

  return 0;
}

上記を「test1-1.c」の名前で保存します。まずコンパイルを行います。

文字列と配列

コンパイルが終わりましたら「test1-1」と入力して実行します。

文字列と配列

今回は文字の配列を1文字ずつ出力するのではなく、文字列としてまとめて出力しました。このように「char」型の配列に文字を格納し最後に「¥0」を付けて文字列とすることで、文字列のために用意された便利な関数などが利用できるようになります。

( Written by Tatsuo Ikura )