设置语言环境后输入4位数字时,operator >>返回失败

暴行

当我imbue为设置语言环境时,我遇到了一些非常奇怪的行为cin

// example.cpp
#include <iostream>
#include <iomanip>
#include <locale>
int main(){
# ifdef LOCALE
  std::cin.imbue(std::locale(LOCALE));
# endif
  long temp;
  const bool status = static_cast<bool>(std::cin >> temp);
  std::cout << std::boolalpha << status << " " << temp << std::endl;
}

如果不使用当前语言环境,则可以编译并运行此代码而不会出现问题。

$ g++ example.cpp -o no-imbue -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | no-imbue
true 100
$ echo 1001 | no-imbue
true 1001

但是,如果我使用当前的语言环境,则会std::cin >> temp因四位数的数字而失败:

$ g++ example.cpp -o imbue-empty -DLOCALE='""' -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | imbue-empty
true 100
$ echo 1001 | imbue-empty
false 1001

将其"en_US.UTF-8"用作语言环境名称""似乎具有相同的效果。

$ g++ example.cpp -o imbue-utf8 -DLOCALE='"en_US.UTF-8"' -std=c++1y -stdlib=libc++ -Wall -Wextra -Werror
$ echo 100 | imbue-utf8
true 100
$ echo 1001 | imbue-utf8
false 1001

我在OSX上使用 clang-600.0.57

$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

这是编译器的错误,还是我做错了什么?

迈尔斯·布德奈克(Miles Budnek)

如果输入1,001,程序将打印true

en_US区域设置预计每个组的三个数字之间的逗号。由于您没有提供,请在上进行std::num_get::get()设置有关更多详细信息,请参见链接,但相关摘录为:failbitstd::cin

第二阶段:字符提取

如果字符与千位分隔符(std::use_facet<std::numpunct<charT>>(str.getloc()).thousands_sep()相匹配并且千位分隔符已被使用std::use_facet<std::numpunct<charT>>(str.getloc()).grouping().length() != 0,则小数点为'。' 尚未累积,将记住角色的位置,但否则将忽略该角色。如果小数点已经累积,则该字符将被丢弃,并且阶段2终止。

阶段3:转换和存储

此后,将检查数字分组。如果在第2阶段丢弃的数千个分隔符的位置与所提供的分组不符std::use_facet<std::numpunct<charT>>(str.getloc()).grouping()std::ios_base::failbit则分配给err

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

失败时从函数返回

来自分类Dev

任务失败时Gulp返回0

来自分类Dev

Zend Db查询失败时返回什么?

来自分类Dev

返回到result()失败时爆炸

来自分类Dev

设置C语言环境后as.Date返回NA

来自分类Dev

该程序可以正常工作,最多9位数字,但失败时只有10位数字

来自分类Dev

约束失败时应返回什么HTTP响应代码?

来自分类Dev

部署工件时出错:传输文件失败返回码是:401

来自分类Dev

PHPUnit-当dataProvider返回空数组时,不要失败

来自分类Dev

从不变函数返回时c ++断言失败

来自分类Dev

左联接返回null时,“ where”条件失败

来自分类Dev

jQuery响应,循环失败时仅返回单个对象

来自分类Dev

PHPUnit-当dataProvider返回空数组时,不要失败

来自分类Dev

在单击处理程序失败时,codeschool jQuery返回Flight 5.10

来自分类Dev

Postgres regexp_replace模式匹配失败时返回

来自分类Dev

字符串函数失败时返回什么?

来自分类Dev

左联接返回null时,“ where”条件失败

来自分类Dev

joni条件失败时,左联接不返回结果

来自分类Dev

API返回认证失败时重定向到登录

来自分类Dev

为什么 test() 在应该失败时返回 True?

来自分类Dev

在 Kotlin 测试中进行比较时,从 Java 返回的 null 失败

来自分类Dev

Extjs4 - 表单提交总是返回失败

来自分类Dev

糟糕,再试一次。您的功能失败,提示是。当它本应返回“关机”时返回“是”

来自分类Dev

对Laravel 4的Ajax请求返回200 OK,但方法始终返回失败

来自分类Dev

to_date未返回年份的4位数字,只有2位

来自分类Dev

opencpu返回最大5位数字

来自分类Dev

输入少于4位数字时阻止输入键

来自分类Dev

C#字符串到数字,解析失败时,TryParse返回true

来自分类Dev

在JavaScript中,当小数点后仅返回一位数字时,如何显示第二个零?

Related 相关文章

  1. 1

    失败时从函数返回

  2. 2

    任务失败时Gulp返回0

  3. 3

    Zend Db查询失败时返回什么?

  4. 4

    返回到result()失败时爆炸

  5. 5

    设置C语言环境后as.Date返回NA

  6. 6

    该程序可以正常工作,最多9位数字,但失败时只有10位数字

  7. 7

    约束失败时应返回什么HTTP响应代码?

  8. 8

    部署工件时出错:传输文件失败返回码是:401

  9. 9

    PHPUnit-当dataProvider返回空数组时,不要失败

  10. 10

    从不变函数返回时c ++断言失败

  11. 11

    左联接返回null时,“ where”条件失败

  12. 12

    jQuery响应,循环失败时仅返回单个对象

  13. 13

    PHPUnit-当dataProvider返回空数组时,不要失败

  14. 14

    在单击处理程序失败时,codeschool jQuery返回Flight 5.10

  15. 15

    Postgres regexp_replace模式匹配失败时返回

  16. 16

    字符串函数失败时返回什么?

  17. 17

    左联接返回null时,“ where”条件失败

  18. 18

    joni条件失败时,左联接不返回结果

  19. 19

    API返回认证失败时重定向到登录

  20. 20

    为什么 test() 在应该失败时返回 True?

  21. 21

    在 Kotlin 测试中进行比较时,从 Java 返回的 null 失败

  22. 22

    Extjs4 - 表单提交总是返回失败

  23. 23

    糟糕,再试一次。您的功能失败,提示是。当它本应返回“关机”时返回“是”

  24. 24

    对Laravel 4的Ajax请求返回200 OK,但方法始终返回失败

  25. 25

    to_date未返回年份的4位数字,只有2位

  26. 26

    opencpu返回最大5位数字

  27. 27

    输入少于4位数字时阻止输入键

  28. 28

    C#字符串到数字,解析失败时,TryParse返回true

  29. 29

    在JavaScript中,当小数点后仅返回一位数字时,如何显示第二个零?

热门标签

归档