前項では、文字変数の取り扱いについて説明しました。
単純に考えれば、この文字変数をたくさん集めると、文字列になるはずです。
同じ型の変数をたくさん集める・・・、どこかで聞いたことがありませんか?
そうです。
文字変数の配列を作れば、すなわち文字列になるのです。
文字変数の配列をC言語では文字列変数として使うことができます。
しかし、ここで1つの疑問が生じます。
それは、文字列の文字数をどのように記憶しておくかということです。
文字数がわからなくては、文字列を取り出す時に困ります。
C言語では、文字列の最後に特別な値を記憶しておくことで文字数を判定します。
この様な文字をとくに
EOSと呼ぶことがあります。
C言語の場合、'\0'がEOSとして扱われます。'\0'は、数値としては0にあたります。
【EOS】
文字列の終わりを表す記号。終端文字とも呼ばれる。
なお、End of String の頭文字をとっている。
文字列を作ることが出来れば、それを表示させることは簡単です。
printf関数では、%s指定子を使って文字列の表示ができます。
ここまでわかれば、文字列を扱うことができます。
次のプログラムは、文字変数の配列に文字列を記憶して表示する例です。
#include <stdio.h>
int main(void)
{
char str[6] = { 'M', 'A', 'R', 'I', 'O', '\0' };
printf("%s\n", str);
return 0;
}
このプログラムの実行結果は次のようになります。
このプログラムを見るとわかりますが、文字列の最後にはEOSが入るため、
配列の要素数は、実際に格納する文字数より1つ多く必要になります。
もちろん、多めの要素数を指定しても問題ありません。
もしも文字列にEOSがなかった場合は、配列の先まで文字列として扱われるので、
偶然にどこかで0(EOS)が見つかるまでは、
延々と文字列が表示され続けることになり、とても困ります。
なお、配列の初期化の時に要素を省略した場合、残りには0が入るので、
char str[6] = { 'M', 'A', 'R', 'I', 'O' };
としても、残りに0が入り、それがEOSとなるので問題ありません。
しかし、今回は最後にEOSがあることを示すためにあえて書きました。
なお、EOSを書いた場合は要素数を省略できます。
前項では、char型の配列で文字列を取り扱えることを説明しました。
しかし、前項で行った文字列を代入する方法は非常に面倒です。
いちいち1文字ずつ区切って書かなければなりません。
C言語では、もっと直感的に文字列を初期化できる方法があります。
今まで文字列を表す時には""で囲んできましたが、これを使う方法です。
なお、"" で囲んだ文字列をとくに、
文字列リテラルと呼ぶことがあります。
文字列リテラルを使うと、簡単に文字列の初期化ができます。
次のプログラムは、前項のプログラムを文字列リテラルで書き換えた例です。
#include <stdio.h>
int main(void)
{
char str[] = "MARIO";
printf("%s\n", str);
return 0;
}
このプログラムの実行結果は次のようになります。
この方法では、文字列を普通に書くだけで良く、要素数を省略することもできます。
この場合、要素数は文字列の長さより1つ多く確保されますが、
多めに領域を確保したい場合には、指定することもできます。
この方法の問題点は、
初期化の時にしか使えないことです。
後から文字列を代入したい場合には、1つ1つ要素に代入するしかありません。
次のプログラムは、1つ1つ要素に代入する例です。
#include <stdio.h>
int main(void)
{
char str[6];
str[0] = 'M';
str[1] = 'A';
str[2] = 'R';
str[3] = 'I';
str[4] = 'O';
str[5] = '\0';
printf("%s\n", str);
return 0;
}
実行結果は、先ほどと同じになります。