8章 文字と文字列



8.1:
どうして、

strcat(string, '!');

はうまく動かないのか。

A:
文字(character)と文字列(string)には大きな違いがある。strcat() は文字列を連結する。

Cの文字は文字集合での値に対応する小さな整数で表現される(以下の 質問8.6を参照)。文字列は文字の配列で表現される。普通は配列の最 初の文字を指すポインターを操作する。文字が来ること期待されてい るところに文字列を使うことも、文字列が来ることを期待されている ところに文字を使うことも間違いである。文字列に!を連結するには、

strcat(string, "!");

を使う。

質問1.32, 7.2, 16.6を参照のこと。

References:
CT&P Sec. 1.5 pp. 9-10.


8.2:
文字列が、ある値と一致するかどうか調べるプログラムを書いている。 なぜ以下のコードではうまくいかないのか。

char *string;
...
if(string == "value") {
/* 文字列が"value"と一致した */
...
}

A:
Cの文字列は文字の配列で表現される。またCは行列を全体として操作 (代入、比較など)することはない。上のコードの==演算子は2つのポ インターを比較している。つまりポインター変数stringと文字列 "value"へのポインターが等しいかどうか調べる。ということは両者 が同じ場所を指しているかどうか調べている。たぶん違うところを指 しているので比較が成功することはない。

2つの文字列を比較するには、普通はライブラリー関数strcmp()を使う。

if(strcmp(string, "value") == 0) {
/* 文字列が"value"と一致した */
...
}


8.3:
どうして、

char a[] = "Hello, world!";

と書けるのに、

char a[14];
a = "Hello, world!";

と書けないのか。

A:
文字列は配列で、配列に直接は代入できない。かわりにstrcpy()を使 う。

strcpy(a, "Hello, world!");

質問1.32, 4.2, 7.2も参照のこと。


8.6:
文字に対応する数値(文字集合)の値や、その逆はどうやって求めれば よいか。

A:
Cで文字は、その値に対応する(その機械が使っている文字集合の)小 さな整数で表現される。だから変換ルーチンは必要ない。文字を持っ ているということは、その値を持っているということである。


8.9:
コンパイラが調子悪い。sizeof('a')の値が1ではなくって2になって いる(sizeof(char)の値と違う)。

A:
知らなくて驚くだろうけど、Cの文字定数はint型を持つ。だから sizeof('a')はsizeof(int)である(ただしC++では話が違う)質問7.8も 参照のこと。

References:
ANSI Sec. 3.1.3.4; ISO Sec. 6.1.3.4; H&S Sec. 2.7.3 p. 29.

目次へ戻る