运营商GT;>在设置区域设置后输入4位数字时返回失败

时间:2016-08-08 16:55:40

标签: c++ macos locale c++14

当我使用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

我使用clang-600.0.57

在OSX上
$ 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

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

1 个答案:

答案 0 :(得分:2)

如果您输入1,001,您的程序应该打印true

en_US语言环境要求每组三位数之间使用逗号。因为您在failbit上没有提供一个std::num_get::get()std::cin。有关更多详细信息,请参阅链接,但相关的摘录如下:

  

第2阶段:字符提取

     

如果字符与千位分隔符匹配   (std::use_facet<std::numpunct<charT>>(str.getloc()).thousands_sep())   并且数以千计的分离正在使用中   std::use_facet<std::numpunct<charT>>(str.getloc()).grouping().length() != 0,然后是小数点&#39;。&#39;还没有积累,   记住角色的位置,但角色是   否则被忽略。如果小数点已经累积,   字符被丢弃,第2阶段终止。

  

第3阶段:转换和存储

     

此后,检查数字分组。如果在舞台上丢弃了数千个分隔符中的任何一个的位置   2与提供的分组不匹配   std::use_facet<std::numpunct<charT>>(str.getloc()).grouping(),   std::ios_base::failbit被分配到err