首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isalpha()给出一个断言

isalpha()给出一个断言
EN

Stack Overflow用户
提问于 2011-07-14 21:08:58
回答 3查看 4.4K关注 0票数 9

我有一段C代码,其中我在ctype.h中使用标准库函数isalpha(),这是在Visual Studio2010-Windows上。在下面的代码中,如果char c是‘as’,isalpha调用返回一个断言,如下面的快照所示:

代码语言:javascript
复制
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表中的字符),我希望能够忽略它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-14 21:27:48

您可能希望将发送给isalpha (以及在<ctype.h>中声明的其他函数)的值强制转换为unsigned char

代码语言:javascript
复制
isalpha((unsigned char)value)

这是少数几种(不是这样)适合使用C语言进行造型的场合之一。

编辑以添加说明。

根据the standard的说法,重点是我的

7.4

1头<ctype.h>声明了几个对分类和映射字符有用的函数。在所有情况下,参数都是int,其值应可表示为unsigned char或应等于宏EOF的值。如果参数有任何其他值,则行为未定义。

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

票数 12
EN

Stack Overflow用户

发布于 2011-07-14 21:14:20

必须将int传递给isalpha(),而不是char。请注意此函数的标准原型:

代码语言:javascript
复制
int isalpha(int c);

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

但是,您必须确保您的char在强制转换时被视为unsigned -您不能简单地将其直接强制转换为int,因为如果它是一个8位字符,则结果int仍然是负数。

确保其正常工作的典型方法是将其转换为unsigned char,然后依靠隐式类型转换将其转换为int

例如:

代码语言:javascript
复制
char c = '£';
int a = isalpha((unsigned char) c);
票数 8
EN

Stack Overflow用户

发布于 2011-07-14 21:15:21

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

http://msdn.microsoft.com/en-us/library/xt82b8z8.aspx

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6693654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档