[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)