[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:15967] Re: Question about C
> 一応 Debian 絡みで少し必要があって C のド素人
> ですが質問です。
>
> envja = getenv("LANG");
> if (strcmp(envja, "ja_JP.ujis") == 0)
>
これ文字列(ポインタの指すメモリの内容)の比較をしています。
> は効くのに
> if ( envja == "ja_JP.ujis" )
> だと効いてないようなんですが何故でしょう。
こっちはポインタの値どうしを比較しています。
envjaって char *型のポインタですよね。
で、"ja_JP.ujis"もポインタです。
Cでは、式の中に文字列リテラル(この場合は"ja_JP.ujis")
が現れると、その文字列の先頭の文字が格納されているメモリへのポインタ
(const char *型)として扱われる事になってるからです。
うーん、、、なんだかわかりにくい説明ですね。
つまり、
int main()
{
char *envja = getenv("LANG");
const char *tmp = "ja_JP.ujis";
/* それぞれが指すメモリの内容を表示 */
printf("envja=%s,tmp=%s\n",envja,tmp);
/* それぞれが指しているメモリアドレスの値を表示 */
printf("envja=%08x,tmp=%08x\n",envja,tmp);
return 0;
}
を実行してみると分かるような気がしますが、どうでしょうか?
(実行結果)
envja=ja_JP.ujis,tmp=ja_JP.ujis
envja=efbfde4b,tmp=00001585
> また case 文の後に長い文が来るとき改行はできる
> のでしょうか、具体的には
>
> case 'J' : 長〜い if 文 break;
>
> のような場合です。sh の case と混同してる気は
> 自分でもしてます(^^;
できます。Cでは改行を入れるのは空白文字を入れるのと
同じ事だと思ってください。(文字列の途中以外なら)
=================================
下佐粉昭 (sim@xxxxxxxxxxxxxxxxx)