所以我目前正在编写一个接受用户文本输入的程序的一部分。我想忽略所有非字母的输入字符,因此我认为 std::isalpha() 是执行此操作的好方法。不幸的是,据我所知,有两个 std::isalpha() 函数,因此需要将通用函数与特定于语言环境的函数区分开来:
(int(*)(int))std::isalpha()
如果我不消除歧义,std::isalpha 似乎在读取大写字母时返回 true,但在读取小写字母时返回 false(如果我直接打印返回值,则非字母字符返回 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)) 片段时才会编译,此时会出现不良行为。有没有大神能指教一下?
最佳答案
您正在将std::alpha()
调用的返回值 转换为int(*)(int)
,然后将该指针与 true
进行比较。将指针与 bool 值进行比较没有多大意义,并且会出现错误。
现在,在没有转换的情况下,您将 std::alpha()
返回的 int
与 true
进行比较。 bool
是一个整数类型,为了比较两个不同的整数类型,首先将值转换为相同的类型。在这种情况下,它们都被转换为 int
。 true
变为 1
,如果 std::isalpha()
返回 2
,比较结果为 2 != 1
。
如果你想将 std::alpha()
的结果与 bool
进行比较,你应该将返回的结果转换为 bool
,或者简单地省略比较并使用类似 if (std::isalpha(c)) {...}
关于c++ - 在 C++ 中消除 std::isalpha() 的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12785609/