isalpha()给出一个断言

我有一个C代码,我在ctype.h中使用标准库函数isalpha(),这是在Visual Studio 2010-Windows上。 在下面的代码中,如果char c为’£’,则isalpha调用将返回一个断言,如下面的快照所示:

在此处输入图像描述

char c='£'; if(isalpha(c)) { printf ("character %c is alphabetic\n",c); } else { printf ("character %c is NOT alphabetic\n",c); } 

我可以看到这可能是因为8位ASCII没有这个字符。

那么如何处理ASCII表外的非ASCII字符呢?

我想要做的是,如果找到任何非字母字符(即使它包含不在8位ASCII表中的字符),我希望能够忽略它。

您可能希望将发送到isalpha (以及在声明的其他函数)的值转换为unsigned char

 isalpha((unsigned char)value) 

这是(不是很少)少数情况下演员阵容适合C的场合之一。


编辑添加解释。

根据标准 ,重点是我的

7.4

1头文件声明了几个对字符分类和映射有用的函数。 在所有情况下,参数都是一个int ,其值应表示为unsigned char或者等于宏EOF的值。 如果参数具有任何其他值,则行为未定义。

转换为unsigned char确保调用isalpha()不会调用未定义的行为。

您必须将int传递给isalpha() ,而不是char 。 请注意此function的标准原型:

 int isalpha(int c); 

传递8位有符号字符将导致该值转换为负整数,从而导致通常由isxxxx()使用的内部数组的非法负偏移量。

但是,您必须确保在转换时将char视为unsigned – 您不能简单地将其直接转换为int ,因为如果它是一个8位字符,则生成的int仍然是负数。

确保这种方法有效的典型方法是将其转换为unsigned char ,然后依靠隐式类型转换将其转换为int

例如

 char c = '£'; int a = isalpha((unsigned char) c); 

您可能正在使用wchar(UNICODE)作为字符类型进行编译,在这种情况下,使用的isalpha方法是iswalpha

http://msdn.microsoft.com/en-us/library/xt82b8z8.aspx