C 给出断言的isalpha()

C 给出断言的isalpha(),c,non-ascii-characters,C,Non Ascii Characters,我有一个C代码,其中我在ctype.h中使用标准库函数isalpha(),这是在VisualStudio2010 Windows上。 在下面的代码中,如果char c是“£”,则isalpha调用将返回一个断言,如下面的快照所示: 我可以看出这可能是因为8位ASCII没有这个字符 那么,如何在ASCII表之外处理这些非ASCII字符呢 我想做的是,如果发现任何非字母字符(即使它包括不在8位ASCII表中的字符),我希望能够忽略它。您必须将int传递给isalpha(),而不是字符。请注意此功能

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

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

那么,如何在ASCII表之外处理这些非ASCII字符呢


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

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

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

但是,您必须确保您的
字符
在强制转换时被视为
无符号
——您不能简单地将其直接强制转换为
int
,因为如果它是8位字符,则生成的
int
仍然是负数

确保此功能正常运行的典型方法是将其强制转换为
无符号字符
,然后依靠隐式类型转换将其转换为
int

e、 g


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


您可能希望将发送到
isalpha
(以及
中声明的其他函数)的值强制转换为
无符号字符

isalpha((unsigned char)value)
这是C语言中适合使用类型转换的少数情况之一


编辑以添加解释

据我所知,重点是我的

7.4

1标题
声明了几个用于分类和映射的函数 人物。在所有情况下,参数都是
int
,其值应为 可表示为
无符号字符
或应等于宏
EOF
的值如果 参数有任何其他值,行为未定义。


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

K谢谢。现在使用if(iswalpha(c)),它不断言,但现在它将“£”作为字母字符传递,而我只想将字母([a..z])推断为字母字符。@Anders-现在,除非goldenmean将其字符更改为wchar_t,否则他将字符和Unicode混合,这肯定是不对的。我不这么认为。甚至当我尝试时-int c;c=';并将其传递给isalpha(c),它断言。@goldenmean如果您的默认字符是有符号的,则仍将传递一个负整数。如果您尝试
int c=(unsigned char)
,会发生什么?正如pmg在上面回答的,char c;c=';isalpha((无符号字符)(c));确实有效。没有断言,isalpha现在返回的“£”不是字母顺序。@goldenmean是的,这正是我所说的。谢谢+1解释请注意,
“£”
不是ASCII字符。你在混淆视听:结果可能会令人惊讶。谢谢。字符c;c=';isalpha((无符号字符)(c));确实有效。没有断言,isalpha现在返回的“£”不是字母顺序。@Alnitak:呵呵,呵呵,我什么都没解释。。。后期编辑
char c = '£';
int a = isalpha((unsigned char) c);
isalpha((unsigned char)value)