gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:27:17 24 4
gpt4 key购买 nike

我正在尝试使用代码片段从 cin 中读取一个 double ,后跟一个字符:

double d;
char c;
while(1) {
cin >> d >> c;
cout << d << c << endl;
}

奇怪的是它对某些角色有效,但对其他角色无效。例如,它适用于“2g”、“2h”,但不适用于“2a”、“2b”、“2x”……:

mwmbp:ppcpp mwisse$ ./a.out

2a
0
2b
0
2c
0
2克
2克
2小时
2小时
2i
0小时
2x
0小时
2z
2z

正如你们中的一位所指出的,它确实适用于整数。你知道为什么它对 double 不起作用吗?我目前还无法找到有关 cin 如何解释其输入的信息。

最佳答案

目前这是 LLVM 上的一个错误:https://llvm.org/bugs/show_bug.cgi?id=17782早在 2014 年,它就从 Howard Hinnant 分配给了 Marshall Clow……好吧,不要屏住呼吸,因为它很快就会得到修复。

编辑:

istream extraction operator内部使用 num_get::do_get它按顺序为 double 执行这些任务:

  1. double 选择一个转换说明符,即 %lg
  2. 测试空输入流
  3. 检查字符串中的下一个字符是否包含在 ctype 中或 numpunct 方面
  4. 如果scanf将允许从 3 获得的字符附加到输入字段,给定在 1 中获得的转换说明符,如果是这样,则重复 3 如果不是5在没有这个字符的输入域上执行
  5. 接受的输入字段中的 double 被读入
  6. 如果5失败failbit分配给 istreamiostate , 但如果 5 成功,结果将分配给 double
  7. 如果 3 中的 facet numpunct 允许任何千位分隔符进入输入字段,则评估它们的位置,如果它们中的任何一个违反了分组 facet 的规则,failbit 分配给 istreamiostate
  8. 如果5中使用的输入字段为空eofbit分配给 istreamiostate

对于 double,您真正关心的是 scanf%lg 转换说明符提取一个 double(在内部取决于 strtof 的约束):

  1. 一个可选的加号或减号
  2. 以下之一
    • “INF”或“INFINITY”(不区分大小写)
    • “NAN”(不区分大小写)
    • “0x”或“0X”,十六进制数字和可选的小数点字符的输入字段,并且可选地后跟“p”或“P”,加号或减号和十进制 指数
    • 十进制数字和可选的小数点字符以及可选的“e”或“E”、加号或减号和非空指数的输入字段

请注意,如果您的 locale 将任何其他表达式定义为可接受的浮点输入字段,这也被接受。因此,如果您在 istream 中添加了一些特殊的酱料,那么您正在使用的可能就是问题所在。除此之外,尾随的“a”、“b”或“x”都不是 %lg 转换说明符的可接受后缀,因此您的实现不兼容,或者您​​还有其他问题不告诉我们。

这是您在符合要求的 gcc5.1 上成功输入的实例:http://ideone.com/nGGW0L

关于C++ - 从 cin 中读取一个 double,后跟一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com