7.
文字列
文字列
・*:..☆ プロローグ ☆..:*・
町の人たちは困っていました。どこからか数え切れないほどの“文字”がやって来て町中に住みついてしまったのです。どこもかしこも文字だらけで、夜もおちおち眠れません。
そんなある日、派手な服を着た男が町へやって来て、町の人と交渉をはじめました。
「みなさん、お困りのようですね。私が文字を何とかしてあげましょう。ただし、金貨千枚をちょうだいします。」
「おお、それは素晴らしい。喜んでお支払いしましょう。」
「よろしい。ではさっそく始めるとしよう。」
交渉が成立すると、男は持っていた笛を吹き鳴らしながら、町の中を歩き始めました。すると不思議なことに、家々から文字が出てきて男のところに集まってきたではありませんか。笛吹き男の後ろには、文字がきれいな一列に並んでついてきています。
「やあ、なんてすごいんだ。文字が並んで文字列になったぞ。」
すると、どんどん長くなる文字列を見ていた町の人が、あることに気がつきました。
「おや、何か意味のある文になっているみたいだぞ。先頭の方は読めるけど、後ろのほうは読めないな。笛吹きさん、その文字列は、どこまで読めばいいんだい?」
「先頭からゼロまでを読めばいいんだよ。ゼロから後は無視してくれていい。」
「そうかそうか。ええと、"金貨千枚払わなければ次は子供を連れて行くぞ\0"」
C言語では文字列を、char 型の配列として扱います。
他のプログラム言語では、基本的なデータ型として“文字列型”といったようなデータ型が用意されている場合も多いのですが、C言語には存在しません。
char 型、つまり 1 バイトの整数に文字コードを格納し、その配列として扱います。
7.1. 文字列の形式
文字列の形式
文字列、“Hello World”は、以下のような配列になります。
#0 |
#1 |
#2 |
#3 |
#4 |
#5 |
#6 |
#7 |
#8 |
#9 |
#10 |
#11 |
|
'H' |
'e' |
'l' |
'l' |
'o' |
' ' |
'W' |
'o' |
'r' |
'l' |
'd' |
0 |
←char型 |
1 行目は、配列の添え字で、2 行目が格納されている文字です。“Hello World”を格納するには、12 以上の要素数が必要です。
文字列の終端
文字列の終端
11 番目の要素を見てください。ここには文字ではなく数値の 0 が入ります。この 0 は文字列の終端を表します。 0 以降に文字があったとしても、文字列としては無視されます。
したがって、以下の文字列は 5 番目の要素が 0 なので、“Hello World”ではなく、“Hello”という文字列になります。
#0 |
#1 |
#2 |
#3 |
#4 |
#5 |
#6 |
#7 |
#8 |
#9 |
#10 |
#11 |
'H' |
'e' |
'l' |
'l' |
'o' |
0 |
'W' |
'o' |
'r' |
'l' |
'd' |
0 |
7.2. 文字定数、文字列定数
文字定数、文字列定数
文字や文字列を、プログラム・コードの中に記述するためには、文字定数、文字列定数を使用します。
文字定数
文字定数
文字定数はシングルクォート(引用符)の中に文字を書きます。
'A'、'B'、'C'、'0'、'1'、'2'、'#'、'$'
ここでの文字(文字定数)は、その文字の文字コードによる数値です。
ASCII 文字セットでは、‘A’に 65 が割り当てられています。したがって、以下のプログラムは、同じ結果になります。
char ch = 'A';
printf( "%c", ch );
char ch = 65;
printf( "%c", ch );
“%c”は、整数を文字として表示します。
文字列定数
文字列定数
文字列定数は、printf( "Hello World\n" ); という式で既に使用しました。
ダブルクォート(二重引用符)の中に複数個の文字を書きます。1 文字、0 文字でもかまいません。
文字列変数の初期化
文字列変数の初期化
以下のように、変数を初期化することが出来ます。
char hello[] = "Hello World";
ここでは、配列の要素数を空欄とし、指定していません。配列の要素数は、初期化する文字列に必要な要素数となります。“Hello World”の場合、終端の 0 も含めて 12 です。
要素数を指定することも出来ますが、その場合には必要な要素数以上の数を指定しなければなりません。必要な要素数より小さい数を指定すると、正しく初期化が行われず、思ったとおりの結果が得られません。
○
char hello[20] = "Hello World";
×
char hello[10] = "Hello World";
7.3. 文字列の出力と入力
文字列の出力と入力
printf、scanf 関数を使用した、文字列の出力と入力について説明します。
文字列の出力
文字列の出力
printf関数は 1 番目の引数として文字列、つまり、終端に 0 を伴った char 型の配列を必要とします。
今までの例では文字列定数を使用していましたが、以下のように文字列の変数を使用することができます。
char hello[] = "Hello World\n";
printf( hello );
また、書式付文字列で文字列を出力するには‘%s’を使用します。
char hello[] = "Hello %s\n";
char world[] = "World";
printf( hello, world );
文字列の入力
文字列の入力
scanf 関数によって文字列を入力するには、以下のように記述します。
char input[200];
scanf( "%s", input );
printf( "入力された文字列は %s です\n", input );
整数値の入力と異なり、変数名の前に‘&’が無いことに注意してください。‘&’の意味については、“ポインタ”の章で説明します。
char 型配列の要素数には、十分に大きな数を指定します。これは、実際に入力された文字数が配列の要素数より大きいと、プログラムが正しく動作しなくなってしまうためです。
しかし、いくら大きい要素数を指定したとしても、危険を避ける事はできません。安全に文字列を入力するためには、別の方法で行うべきです。また、処理系によっては、安全性を考慮した scanf と同等の関数が用意されています。