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