在C ++中消除std :: isalpha()的歧义

时间:2012-10-08 16:24:00

标签: c++ std sfml

所以我目前正在编写一个带有用户文本输入的程序的一部分。我想忽略所有不是字母的输入字符,所以我认为std :: isalpha()是一个很好的方法。不幸的是,据我所知,有两个std :: isalpha()函数,因此通常需要从特定于语言环境的函数中消除歧义:

(int(*)(int))std::isalpha()

如果我不消除歧义,std :: isalpha似乎在读取大写时返回true但在读取小写字母时返回false(如果我直接打印返回的值,则返回0表示非alpha字符,1表示大写字母字符,2表示小写字符)。所以我需要这样做。

之前我在另一个程序中已经这样做了,但出于某种原因,在这个项目中,我有时会得到“ISO C ++禁止”错误。请注意,有时候。这是一个有问题的代码区域(这个区域一起显示没有任何东西):

std::cout << "Is alpha? " << (int(*)(int))std::isalpha((char)Event.text.unicode) << "\n";

if ( (int(*)(int))std::isalpha((char)Event.text.unicode) == true)
{
    std::cout << "Is alpha!\n";
    //...snip...
}

第一个例子,我将返回的值发送到std :: cout,工作正常 - 我没有得到任何错误,我得到了预期的值(0表示非alpha,1表示alpha),如果这是只有我尝试消除歧义的地方,程序编译并运行良好。

然而,第二个例子引发了这个:

error: ISO C++ forbids comparison between pointer and integer

并且仅在我删除(int(*)(int))片段时进行编译,此时会出现不良行为。有人可以在这里启发我吗?

2 个答案:

答案 0 :(得分:3)

您正在将<{1}} std::alpha()调用的返回值投射到int(*)(int),然后将该指针与true进行比较。比较指向布尔值的指针没有多大意义,你会收到错误。

现在,在没有演员表的情况下,您将int返回的std::alpha()true进行比较。 bool是整数类型,为了比较两种不同的整数类型,首先将值转换为相同的类型。在这种情况下,它们都转换为inttrue变为1,如果std::isalpha()返回2,则比较结果为2 != 1

如果您想将std::alpha()的结果与bool进行比较,则应该将其返回到bool,或者只是省略比较并使用{{1}之类的内容}}

答案 1 :(得分:2)

没有必要消除歧义,因为正常通话中没有歧义。

此外,当您从std::获取函数声明时,不需要使用<ctype.h>前缀,在C ++ 11之后是您应该优先使用的标头(即,不是{{ 1}}) - 在C ++ 11之前也是如此,但是C ++ 11获得了它。

第三,您不应将结果与<cctype>进行比较。

但是,您需要将true参数强制转换为char,以免获得除7位ASCII之外的任何内容的未定义行为。

E.g。这样做:

unsigned char