namazu-dev(ring)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: isdigit
安部です。
Motoyuki Kasahara wrote:
> そういう実装も世の中にはあるかも知れませんが、Win32 でそれはあ
> るでしょうか。char で表せる範囲を int に拡張したのなら、多分な
> いような気がするんですけど....。誤動作だとすれば、ISO 8859 の文
> 字でも同じことが起きる筈です。
>
> まず、-255 〜 255 を順に isdigit() に与えてみて、結果をみるとい
> うのは、いかがでしょう。
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
int
main ()
{
int i;
printf ("locale: %s\n", setlocale (LC_ALL, ""));
for (i = -255; i < 256; ++i)
{
if (isdigit(i))
{
printf ("%d is TRUE: ", i);
putchar(i);
putchar('\n');
}
}
}
というプログラムで、LANG=fr_FR.ISO-8859-1で試してみました。
結果は以下のとおり(GNU/Linux glibc-2.1の場合):
locale: fr_CA
-154 is TRUE: f
-152 is TRUE: h
-148 is TRUE: l
-146 is TRUE: n
-132 is TRUE: |
-130 is TRUE: ~
48 is TRUE: 0
49 is TRUE: 1
50 is TRUE: 2
51 is TRUE: 3
52 is TRUE: 4
53 is TRUE: 5
54 is TRUE: 6
55 is TRUE: 7
56 is TRUE: 8
57 is TRUE: 9
iswdigit()も試してみました。
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>
int
main ()
{
int i;
printf ("locale: %s\n", setlocale (LC_ALL, ""));
for (i = -255; i < 256; ++i)
{
if (isdigit (btowc (i)))
{
printf ("%d is TRUE: ", i);
putchar(i);
putchar('\n');
}
}
}
これの結果は、
locale: fr_FR
48 is TRUE: 0
49 is TRUE: 1
50 is TRUE: 2
51 is TRUE: 3
52 is TRUE: 4
53 is TRUE: 5
54 is TRUE: 6
55 is TRUE: 7
56 is TRUE: 8
57 is TRUE: 9
となります。
A A
= . . =
V
end
Ryuji Abe