第17章

第17章 文字と文字列の違い

前回までで、普通に使われる命令文は説明したつもりですので、 C言語の難関”文字列”についてやってみようと思います。 文字列というぐらいなので、文字が複数あります。 ですので、9章でやった配列を使うんだなということぐらいは、 想像がつくと思います。
ではいつものように簡単な例を示します。







文字列ではなく文字の時は一重引用符「 ' 」で囲うんですが、 文字列の時は二重引用符「 " 」で囲みます。 そしてお決まりの「printf」関数ですが、ここも文字の場合は「%c」ですが、 文字列の場合は「%s」になります。 ここで注意しなくてはならないのは初期化 してやらなくてはならないことです。
void main()
{
  char s[10];
  s[10]="Hello!";
  printf("%s\n", s );
}
や、
void main()
{
  char s[10];
  s="Hello!";
  printf("%s\n", s );
}
といったプログラムはエラーになります。
なんでだめなの?
う〜ん、これは結構難しくてですねー、これについては追々説明していくことにします。 ところで、エラーのないプログラムではどのようになっているかを より詳しく見ていくことにしましょう。 って言っても、文字列”s[10]”がどのようになっているかを説明します。 C言語では配列がどのようになっているかは9章で説明しましたが、 [0]から始まります。よって、”s”は次のようになります。

 0 1 2 3 4 5 6 7 8 9
−−−−−−−−−−−−−−−−−−−−−
|H|e|l|l|o|!|\0|\0|\0|\0|
−−−−−−−−−−−−−−−−−−−−−
0〜9までで10個となるのはもう説明するまでもないですが、 6番目からの「\0」ってゆーのは何か説明しなければなりませんね。 これはヌルコード(以下NULL)と言って、 文字列の最後を表す文字です。 ですので、このNULLが無いと文字列にはなりません。
試しに、「s[6]」と宣言して先ほどのプログラムを実行してみてください。 私の環境ではこのような実行結果になります。



Hello!まではいいですがその後が何か分けのわからないことになっています。 これはNULLが無いため、 printf文はどこまでが文字列かどうかがわからなくなってしまい、 変な文字まで出力してしまったんです。 もう察しのいいかたなら気づいているとは思いますが、 C言語にはこのような決まりがあるため、6文字表示したければ、 宣言時に[7]とNULLの分を考えて、 1つ以上余分に配列をきってやる必要があります。
(なぜか知らんが、開発者の間では「きる」という単語がよく出てくる。 この配列を「きる」や、仕様書を書くことを、仕様を「きる」と言うし、 FORTRANで用いるEQUIVALENCE文を使うことを、 EQUIVALENCEを「きる」と、これまた「きる」なんですねー。 どーでもいい話ですけど・・・)
また、初期化する以外の文字列を作成する方法を1つ紹介しておきます。







この方法は、宣言時に代入するのとは少し違います。 これもC言語を扱う上で注意しなければならないことなんですが、 宣言した変数は宣言時には何が入っているかわからないんです。 変数sは上の例ではこうなっています。
 0 1 2 3 4 5 6 7 8 9
−−−−−−−−−−−−−−−−−−−−−
|?|?|?|?|?|?|?|?|?|?| 宣言時
−−−−−−−−−−−−−−−−−−−−− 何が入っているかはわからない
          ↓
−−−−−−−−−−−−−−−−−−−−−
|W|o|r|l|d|?|?|?|?|?| 配列の0〜4番目まで文字を代入
−−−−−−−−−−−−−−−−−−−−− この時点ではsはまだ文字列ではない
          ↓
−−−−−−−−−−−−−−−−−−−−−
|W|o|r|l|d|\0|?|?|?|?| 配列の5番目にNULLを代入
−−−−−−−−−−−−−−−−−−−−− これでやっと文字列になる
宣言時に代入するやり方(Hello!)では、文字以外の配列は全部NULLとなっていましたが、 1つ1つ代入するやり方では6番目以降は何も代入していないので、 何が入っているかわかりません。
だからどうした?
まだ問題にはならないんですが、文字列を扱う上でこのようなゴミは、 注意しないとわけのわからないバグの原因になる時があるんですよ。
今後文字列は大変よく出てきますので、しっかりと今回のことは理解しておいてください。 でないと、これから文字列、配列、ポインタの話が出てくるのですが、 全くちんぷんかんぷんになってしまいます。

C言語のメニューに戻る

TOPに戻る