c++ - <locale> 中的 "ctype"函数抛出 std::bad_cast

标签 c++ locale facet libstdc++

这个程序

#include <iostream>
#include <locale>

int main () {
    std::isxdigit(std::cin.peek(), std::cin.getloc());
}

抛出 std::bad_cast 类型的异常使用 libstdc++ 使用 gcc 或 clang 编译时在我身上。用VS2010运行正常。

我明白这里发生了什么。 peek()返回 int以适应带外 EOF 值。语言环境不需要 ctype<int>方面(他们在 VS 中确实有这个方面,也许作为扩展)。如果语言环境没有执行功能的方面,它将抛出 bad_cast。 .

但这不应该按照原始 <ctype.h> 的精神来工作吗? ?这是标准的缺陷吗?是否有普遍接受的解决方法?我知道我可以自己检查 EOF 并转换为相关的字符类型,但我不想重新发明轮子。

最佳答案

否:必须知道字符类型(假设 32 位 int 是具有 EOF 的 64 位表示的字符类型)。它无法解析,区域设置不受特定字符类型的限制,但它的方面是。

拥有:

std::isxdigit<char>(std::cin.peek(), std::cin.getloc());

将澄清调用并(!)忽略 EOF 使其成为 char(int(-1))。

因此您可以自己检查 EOF。

关于c++ - <locale> 中的 "ctype"函数抛出 std::bad_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657722/

相关文章:

c++ - Socket编程C++报错undefined reference

c++ - 为什么这个函数头不是最优的

python - Python中的语言环境日期格式

javascript - Android webview 中的语言环境时间错误

r - ggplot2:使用选定的面和零件数据创建绘图

r - 组合 geom_tile() 和 facet_grid/facet_wrap 并删除图 block 之间的空间 (ggplot2)

c++ - 如何通过填充选项将一个矩形缩放到另一个矩形(例如将图片缩放到窗口)并保持纵横比?

c++ - C/C++ : passing a struct/class with a member array to a function by value

c++ - Windows 事件代码页

r - 如何在 ggplot facets 中按值对数据进行排序