Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

char buf[]="漢字を含んだ文字列の宣 言"

76 views
Skip to first unread message

tabe

unread,
Dec 10, 2002, 7:13:02 AM12/10/02
to
田部です。
ネタふり(って正解がわかっていません)
問題:
漢字を含んだ文字列の宣言で正しい物は以下のどれか?
#ターゲット環境はメモリ制限が厳しいと仮定します。
案1:
char buf[] = "漢字を含んだ文字列の宣言"
長所:
コンパイラにstrcmp(buf,buf)で文句を言われない
短所:
char *cp = buf ;
if(*cp >= 0x80) とかの、オーバーASCIIで駄目。
案2:
unsigned char buf[] = "漢字を含んだ文字列の宣言"
長所;
案1の短所が無い。
短所:
strcmp,strlenでキャストしまくり。汚い。
BYTE buf[]="漢字を含んだ文字列の宣言"; も同様で汚い・
案3:
wchar_t buf[] = "漢字を含んだ文字列の宣言"
長所: 綺麗。
短所: メモリ食う。

ジャパニの現状の正解は
どれなのでしょう。
私の個人的な正解は案1です。
--
以上


IIJIMA Hiromitsu

unread,
Dec 10, 2002, 10:18:38 AM12/10/02
to
いいじまです。

> 問題:
> 漢字を含んだ文字列の宣言で正しい物は以下のどれか?
> #ターゲット環境はメモリ制限が厳しいと仮定します。
> 案1:
> char buf[] = "漢字を含んだ文字列の宣言"
> 長所:
> コンパイラにstrcmp(buf,buf)で文句を言われない
> 短所:
> char *cp = buf ;
> if(*cp >= 0x80) とかの、オーバーASCIIで駄目。

符号指定なしの char でこう書くなら、明示的に
if (*(unsigned char)cp >= 0x80)
とするとか、
if (*cp & 0x80)
で代用するとか、あるいは、必要なときだけ
static char buf[] = "漢字を含んだ文字列の宣言";
unsigned char *cp = buf; //警告出るならキャストしてね
とかするべきだと思います。最適化コンパイラを使えば、コンパイルし
た機械語コードは単なる符号なしのバイト比較命令になるはずです。
(8086 なら cmp byte ptr [SI],80H か test byte ptr [SI], 80H
でしょう。)

> 案2:
> unsigned char buf[] = "漢字を含んだ文字列の宣言"
> 長所;
> 案1の短所が無い。
> 短所:
> strcmp,strlenでキャストしまくり。汚い。
> BYTE buf[]="漢字を含んだ文字列の宣言"; も同様で汚い・

キャストしまくってもランタイムのメモリ消費には影響しないです。

> 案3:
> wchar_t buf[] = "漢字を含んだ文字列の宣言"
> 長所: 綺麗。
> 短所: メモリ食う。

この場合は
wchar_t buf[]= L"漢字を含んだ文字列の宣言";
でないかい…というのは別にして、文字列処理関数をワイド文字用に
別途用意しなければいけないのが難点ですね。

というわけで、私も案 1 を推します。

========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta [PC] mailto:delm...@ht.sakura.ne.jp

IIJIMA Hiromitsu

unread,
Dec 10, 2002, 10:50:20 AM12/10/02
to
いいじまです。訂正。

> if (*(unsigned char)cp >= 0x80)

間違い。
1) if (*(unsigned char *) cp >= 0x80)
2) if ( (unsigned char)cp[0] >= 0x80)
のどちらかです。

Hisao Aoyama

unread,
Dec 11, 2002, 2:27:17 AM12/11/02
to
"tabe" <ta...@mug.biglobe.ne.jp> writes:

> 問題:
> 漢字を含んだ文字列の宣言で正しい物は以下のどれか?

文字列は宣言しないと思いますが,配列の初期化ということで
しょうか?

> 短所:
> char *cp = buf ;
> if(*cp >= 0x80) とかの、オーバーASCIIで駄目。

if(*cp < 0) とか if(!isascii(*cp)) とか書ける,ではダメ?

# 意味が違ってたらごめんなさい.

----
Hisao Aoyama 青山 尚夫
ASTEC Products, Inc. (株)アステック・プロダクツ
aoy...@astec.co.jp

0 new messages