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

标签 c++ std sfml

所以我目前正在编写一个接受用户文本输入的程序的一部分。我想忽略所有非字母的输入字符,因此我认为 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() 返回的 inttrue 进行比较。 bool 是一个整数类型,为了比较两个不同的整数类型,首先将值转换为相同的类型。在这种情况下,它们都被转换为 inttrue 变为 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/

相关文章:

c++ - 重载函数的实现

C++排序算法

C++ vector emplace_back 调用复制构造函数

c++ - partition_point 和 lower_bound 有什么区别?

c++ - 无法在动态链接库 sfml-graphics-2.dll 中找到过程入口点 _ZSt24__throw_out_of_range_fmtPKcz

c++ - 在 XCode 中构建时出现 FreeType 错误

c++ - 如何使用c++中的文件读写doc、pdf文件

c++ - 在不剪切文本的情况下设置 QDialog 的固定大小

c++ - 两个 `std::map` 的交集

c++ - 未解析的外部符号 - 静态