当我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
这是编译器的错误,还是我做错了什么?
如果输入1,001
,程序将打印true
。
的en_US
区域设置预计每个组的三个数字之间的逗号。由于您没有提供,请在上进行std::num_get::get()
设置。有关更多详细信息,请参见链接,但相关摘录为:failbit
std::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] 删除。
我来说两句