加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – “ctype”函数抛出std :: bad_cast

发布时间:2020-12-16 07:06:16 所属栏目:百科 来源:网络整理
导读:这个计划 #include iostream#include localeint main () { std::isxdigit(std::cin.peek(),std::cin.getloc());} 当使用libstdc使用gcc或clang编译时,会抛出类型为std :: bad_cast的异常.它与VS2010一起正常运行. 我明白这里发生了什么. peek()返回一个int以
这个计划

#include <iostream>
#include <locale>

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

当使用libstdc使用gcc或clang编译时,会抛出类型为std :: bad_cast的异常.它与VS2010一起正常运行.

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

但是,这不应该根据原始< ctype.h>的精神工作吗?这是标准中的缺陷吗?有一个普遍接受的解决方法吗?我知道我可以自己检查EOF并投射到相关的角色类型,但我宁愿不重新发明轮子.

解决方法

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

有:

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

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

因此,您可以自己检查EOF.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读