厳密にいうとC言語に文字列というデータ種別はない。 Rubyであれば
s = "Hello"
s = s+", world!"
printf "%s\n", s
=> Hello, world!
のように、自由に文字列を代入したり、文字列同士を足す(結合する)ことが できるがC言語ではそんなに自由にはできない。
C言語ではchar 型の配列に文字コードを連続して詰めこんだもの を文字列と見なして取り扱う。つまり、文字列を使いたかったら
文字列の全ての文字コードを含む配列として宣言
しなければならない。もし、"Hello"
という
文字列を値に持つ変数を作りたかったら以下のようにする。
char s[] = "Hello";
このように書くとC言語の内部には以下のような char 型配列が作られ、
それが変数 s
に結びつけられる。
s | |||||
---|---|---|---|---|---|
s[0] | s[1] | s[2] | s[3] | s[4] | s[5] |
H | e | l | l | o | \0 |
72 | 101 | 108 | 108 | 111 | 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言語ってほんとアホ。
やってられん!
続く…