我有一段C代码,其中我在ctype.h中使用标准库函数isalpha(),这是在Visual Studio2010-Windows上。在下面的代码中,如果char c是‘as’,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表中的字符),我希望能够忽略它。
发布于 2011-07-14 21:27:48
您可能希望将发送给isalpha (以及在<ctype.h>中声明的其他函数)的值强制转换为unsigned char
isalpha((unsigned char)value)这是少数几种(不是这样)适合使用C语言进行造型的场合之一。
编辑以添加说明。
根据the standard的说法,重点是我的
7.4
1头<ctype.h>声明了几个对分类和映射字符有用的函数。在所有情况下,参数都是int,其值应可表示为unsigned char或应等于宏EOF的值。如果参数有任何其他值,则行为未定义。
对unsigned char的强制转换确保调用isalpha()不会调用未定义的行为。
发布于 2011-07-14 21:14:20
必须将int传递给isalpha(),而不是char。请注意此函数的标准原型:
int isalpha(int c);传递8位有符号字符将导致将值转换为负整数,从而导致isxxxx()通常使用的内部数组中出现非法的负偏移量。
但是,您必须确保您的char在强制转换时被视为unsigned -您不能简单地将其直接强制转换为int,因为如果它是一个8位字符,则结果int仍然是负数。
确保其正常工作的典型方法是将其转换为unsigned char,然后依靠隐式类型转换将其转换为int。
例如:
char c = '£';
int a = isalpha((unsigned char) c);发布于 2011-07-14 21:15:21
您可以使用wchar (UNICODE)作为字符类型进行编译,在这种情况下,要使用的isalpha方法是iswalpha
http://msdn.microsoft.com/en-us/library/xt82b8z8.aspx
https://stackoverflow.com/questions/6693654
复制相似问题