我试图使用该片段从cin读取一个双字母,然后是一个字符:
double d;
char c;
while(1) {
cin >> d >> c;
cout << d << c << endl;
}
奇特之处在于它适用于某些角色,但不适用于其他角色。例如,它适用于&#34; 2g&#34;,&#34; 2h&#34;,但是&#34; 2a&#34;,&#34; 2b&#34;,&#34; 2x& #34; ...
mwmbp:ppcpp mwisse $ ./a.out
2A
0
2B
0
2C
0
2克
2克
2H
2H
2I
0H
2X
0H
2Z
2z
正如你们其中一个人所指出的,它确实适用于整数。你知道它为什么不能用于双打吗?我还没有找到有关cin如何解释其输入的信息。
答案 0 :(得分:1)
目前这是LLVM上的一个错误:https://llvm.org/bugs/show_bug.cgi?id=17782 回到2014年,从那时起,霍华德·亨宁特就被分配到了马歇尔·克洛(Marshall Clow)......不管怎么说,不要马上让你屏住呼吸。
修改强>
istream
extraction operator内部使用num_get::do_get
为double
顺序执行这些任务:
double
%lg
ctype
或numpunct
facet
scanf
允许将 3 获得的字符附加到输入字段,并且在 1 中获得转换说明符,则为如果在没有此字符的输入字段上执行 5 ,则重复 double
strtold
和c++11 strtod
从c++17 failbit
已分配给istream
&#39; iostate
,但如果 5 成功,结果已分配给double
facet numpunct
允许任何数千个分隔符进入输入字段,则会评估其位置,如果其中任何一个违反了grouping
facet
规则} {},failbit
已分配给istream
&#39; s iostate
eofbit
已分配给istream
&#39; s iostate
对于double
,您真的很关心scanf
的{{1}}转换说明符的规则。提取%lg
(内部将取决于strtof
的约束):
请注意,如果您的double
将任何其他表达式定义为可接受的浮点输入字段,则也会接受此字段。因此,如果您已经为locale
添加了一些特殊的酱汁,那么您可能会遇到问题所在。除此之外,无论是尾随&#34; a&#34;,&#34; b&#34;还是&#34; x&#34;是istream
转化说明符的可接受后缀,因此您的实施不符合要求或者您没有告诉我们其他内容。
以下是您在gcc5.1上取得成功的实际示例:符合http://ideone.com/nGGW0L
答案 1 :(得分:0)
由于问题是由错误(或功能,取决于你的观点)引起的,在libc ++中,似乎最简单的避免方法是使用libstdc ++,直到修复到位。如果您在mac上运行,请将-stdlib = libstdc ++添加到您的编译标志中。 g ++ -stdlib = libstdc ++ test.cpp将正确编译本文中给出的代码。
在了解这些不同的库之前,Libc ++似乎有其他类似的错误,其中一个我在此发布:Trying to read lines from an ASCII file using C++ , Ubuntu vs Mac...?。