3

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

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

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

我以前在另一个程序中这样做过,但由于某种原因,在这个项目中,我有时会收到“ISO C++ forbids”错误。注意,只是有时。这是有问题的代码区域(它一起出现,中间没有任何东西):

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)) 片段时才编译,此时会出现不良行为。有人可以在这里启发我吗?

4

2 回答 2

3

您正在将调用的返回值转换为,然后将该指针与. 将指针与布尔值进行比较没有多大意义,并且会出现错误。std::alpha()int(*)(int)true

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

如果您想将结果std::alpha()与 a进行比较bool,您应该将返回的结果转换为bool,或者干脆忽略比较并使用类似的东西if (std::isalpha(c)) {...}

于 2012-10-08T16:35:10.433 回答
2

无需消除歧义,因为正常通话中没有歧义。

此外,当您从 获取函数声明时不需要使用std::前缀<ctype.h>,在 C++11 之后是您最好使用的头文件(即,不是<cctype>)——就此而言,在 C++11 之前也是如此,但 C ++11 成功了。

第三,您不应该将结果与true.

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

例如这样做:

bool isAlpha( char const c )
{
    typedef unsigned char UChar;
    return !!isalpha( UChar( c ) );
}
于 2012-10-08T16:39:54.300 回答