C 给出断言的isalpha()
我有一个C代码,其中我在ctype.h中使用标准库函数isalpha(),这是在VisualStudio2010 Windows上。 在下面的代码中,如果char c是“£”,则isalpha调用将返回一个断言,如下面的快照所示: 我可以看出这可能是因为8位ASCII没有这个字符 那么,如何在ASCII表之外处理这些非ASCII字符呢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(),而不是字符。请注意此功能
我想做的是,如果发现任何非字母字符(即使它包括不在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)