以前データ型のところで
文字列について説明をしました。この文字列はchar型の文字の集まりなのでchar型の配列を使えば文字列を代入できます。文字列は一番最後に
'\0'(ヌル文字)という文字列の最後を示す特別な文字が含まれています。
例えば、「A」という文字を表すのに文字定数の場合は'A'という1文字なのでchar型の領域が1つ必要です。しかし、文字列の場合は'A'と'\0'の2個の領域が必要になるのです。実は文字列定数自体がchar型の配列によって実現されていて、文字列定数を使うと暗黙的に文字列配列として扱われます。
文字列配列もchar型配列と変わりないので同様な方法で宣言や初期化ができます。ただ最後の要素'\0'について考慮しないといけません。
[ 例 ] 文字列配列の初期化例
ex5-1.c
char string1[9] ;
/* char型の配列 string1 の宣言 */
char string2[9] = "String 2" ;
/* char型の配列 string2 の宣言と初期化 */
int cnt = 0;
string1[0] = 'S';
/* string1の要素を1つづつ初期化 */
string1[1] = 't';
string1[2] = 'r';
string1[3] = 'i';
string1[4] = 'n';
string1[5] = 'g';
string1[6] = ' ';
string1[7] = '1';
string1[8] = '\0';
/* 最後に'\0'をつける */
/* string1を表示 */
printf ("string1 : %s\n", string1);
/* 文字列をそのまま表示 */
/* string2を表示 */
printf ("string2 : ");
while (string2[cnt] != '\0') {
/* '\0'が見つかるまでループ */
printf ("%c", string2[cnt] );
/* 文字列の要素を1文字ずつ表示 */
cnt++;
}
printf ("\n");
上の例では2つの文字列配列 string1,string2 をそれぞれ違う方法で初期化、表示をしています。string1の初期化は1文字ずつ初期化しています。この方法で重要なことは最後の要素に忘れずに '\0' を代入することです。string2は初期化と同時に代入も行っています。文字列定数 "String 2" には '\0' も含まれているので代入時に特に意識しなくても済みます。
次に表示ですが、string1は文字列をそのまま出力しています。string2は各要素1文字ずつ表示しています。特に理由がなければstring1の方式で表示するのが便利です。
さて、初期化についてもう少し見てみましょう。次の初期化の例を見て下さい。
char string[5] = "abcde"
5文字の文字列を代入しているので一見問題がないように見えてしまいます。しかし、'\0' の分の要素が足りません。
このように初期化時に要素数を記述すると勘違いや数え間違えで誤った要素数を指定してしまう可能性があります。そこで、文字列配列を宣言と同時に初期化する場合は要素数を省略してコンパイラに要素数を判断させたほうが安全です。
char string[ ] = "abcde" /* こちらの方がより安全 */
文字列配列を宣言するときにはそのサイズに注意しないといけません。実行時にどれだけの要素数が必要かを予測し、その最大値よりも大きいサイズにします。もし宣言したサイズよりも長い文字列を代入するとバグが発生します。
配列よりも文字列の方が短いときはどうなるのでしょうか?例えば、char string[128] = "test" を実行したとします。このとき string[0] から string[4] までが"test"という文字列として判断されます。string[5] から string[127] までは領域は確保されますが初期化はされていないのでどのような値になっているかは不定です。
○ソースファイルのダウンロード○
この章に使った例のソースファイルを1つにまとめて圧縮してあります。
【中に含まれているソースファイル】
ex5-1.c
example05.lzh (804 Bytes)