C ++ - 从cin中读取一个double,后跟一个字符

时间:2016-05-26 11:10:54

标签: c++ cin

我试图使用该片段从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如何解释其输入的信息。

2 个答案:

答案 0 :(得分:1)

目前这是LLVM上的一个错误:https://llvm.org/bugs/show_bug.cgi?id=17782 回到2014年,从那时起,霍华德·亨宁特就被分配到了马歇尔·克洛(Marshall Clow)......不管怎么说,不要马上让你屏住呼吸。

修改

istream extraction operator内部使用num_get::do_getdouble顺序执行这些任务:

  1. 选择double %lg
  2. 的转化说明符
  3. 测试空输入流
  4. 检查字符串中的下一个字符是否包含在ctypenumpunct facet
  5. 如果scanf允许将 3 获得的字符附加到输入字段,并且在 1 中获得转换说明符,则为如果在没有此字符的输入字段上执行 5 ,则重复
  6. 读入接受的输入字段中的double
  7. 如果 5 失败failbit已分配给istream&#39; iostate,但如果 5 成功,结果已分配给double
  8. 如果 3 中的facet numpunct允许任何数千个分隔符进入输入字段,则会评估其位置,如果其中任何一个违反了grouping facet规则} {},failbit已分配给istream&#39; s iostate
  9. 如果 5 中使用的输入字段为空eofbit已分配给istream&#39; s iostate
  10. 对于double,您真的很关心scanf的{​​{1}}转换说明符的规则。提取%lg(内部将取决于strtof的约束):

    1. 可选的加号或减号字符
    2. 以下之一
      • &#34; INF&#34;或&#34; INFINITY&#34; (不区分大小写)
      • &#34; NAN&#34; (不区分大小写)
      • &#34; 0X&#34;或&#34; 0X&#34;,十六进制数字的输入字段和可选的小数点字符,并且可选地后跟&#34; p&#34;或&#34; P&#34;加号或减号以及十进制指数
      • 十进制数字的输入字段和可选的小数点字符,以及可选的&#34; e&#34;或&#34; E&#34;加号或减号以及非空指数
    3. 请注意,如果您的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...?