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