文字列

厳密にいうとC言語に文字列というデータ種別はない。 Rubyであれば

s = "Hello"
s = s+", world!"
printf "%s\n", s

=> Hello, world!

のように、自由に文字列を代入したり、文字列同士を足す(結合する)ことが できるがC言語ではそんなに自由にはできない。

C言語の文字列

C言語ではchar 型の配列に文字コードを連続して詰めこんだもの を文字列と見なして取り扱う。つまり、文字列を使いたかったら

文字列の全ての文字コードを含む配列として宣言

しなければならない。もし、"Hello" という 文字列を値に持つ変数を作りたかったら以下のようにする。

char s[] = "Hello";

このように書くとC言語の内部には以下のような char 型配列が作られ、 それが変数 s に結びつけられる。

s
s[0]s[1]s[2]s[3] s[4]s[5]
Hello \0
72101108108111 0

宣言には "Hello" という文字列しか書いていないのに s[5] という要素が余計に付いている。そこに入っている '\0' は文字コードが0の文字であり、それは文字列の終端 を意味する。C言語では、文字列として使いたいものは必ずおしりに '\0' を付けなければならない(でも見えない)。したがって、 Helloという5文字の文字列を記憶させたい場合でも、おしりに '\0' を付けるので6個の要素が必要になる。

このようにして宣言した s は、printf で文字列として表示することができる。

char s[] = "Hello";
printf("s の内容: %s\n", s);

 => s の内容: Hello

Rubyと違い、C言語で一度宣言した文字列はあとから長さを伸ばしたりするこ とはできない。C言語での文字列はあくまでも「配列」のひとつなので、 配列の要素が増やせないのと同様、一度確保した文字列の長さを伸ばすことは できない。

ああ不便。ふべんだふべん。ほんとに不便だ。C言語ってほんとアホ。 やってられん!
続く…


目次