isalpha()给出一个断言

时间:2011-07-14 13:08:58

标签: c non-ascii-characters

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

enter image description here

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表中的字符),我希望能够忽略它。

3 个答案:

答案 0 :(得分:10)

您可能希望将发送到isalpha的值(以及<ctype.h>中声明的其他函数)转换为unsigned char

isalpha((unsigned char)value)

这是(不是很少)少数情况下演员阵容适用于C。


编辑添加解释。

根据the standard,强调是我的

  

7.4

     

1标题<ctype.h>声明了几个对分类和映射有用的函数   字符。在所有情况下,参数都是int,其值应为。{1}}   可表示为unsigned char或等于宏EOF的值。 如果   参数有任何其他值,行为未定义。

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

答案 1 :(得分:8)

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

int isalpha(int c);

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

但是,您必须确保在投射时char被视为unsigned - 您不能简单地将其直接投放到int,因为如果它是8位字符,结果int仍然是否定的。

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

e.g。

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

答案 2 :(得分:2)

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

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