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