【问题标题】:Input using std::cin doesn't work for floating point only when the value is trailed by the letter 'e' (both upper and lower case)仅当值后跟字母“e”(大写和小写)时,使用 std::cin 的输入不适用于浮点
【发布时间】:2020-01-25 17:00:33
【问题描述】:

我编写了一个从 std::cin 获取用户输入并将其返回的方法,到目前为止,它适用于我的所有测试,除了浮点数或双精度后跟字母“e”。

这是方法:

template <typename Arg>
Arg getInput(string message = "")
{
    if (!is_fundamental<Arg>::value && typeid(string) != typeid(Arg))
    {
        return Arg();
    }

    if (!message.empty())
    {
        print(message);
    }

    Arg out;
    cin >> out;

    while (cin.fail())
    {
        cin.clear();
        cin.ignore();
        cin >> out;
    }

    cin.ignore(INT_MAX, '\n');

    return out;

}

这是方法调用:

getInput<double>("Please Enter a Double: ");

该方法为我迄今为止尝试过的所有内容返回正确的值,但当值后面带有“e”时 std::cin 失败。

例如:12.34 被读取为 12.34,ae1.23f1 被读取为 1.23,但 std::cin 在 1.2ef 和 12E 上失败,因为数字后面紧跟着和 'e'

请注意,当方法的返回类型更改为 float 时,它仍然会产生与 double 相同的问题。这对我来说没有任何意义,因为这是我发现导致程序无法运行的唯一原因,所以我的猜测是 std::cin 处理输入的方式。

免责声明:我是来自 java 的 c++ 新手,所以我的代码可能还有其他一些小错误,例如 return Arg();如果该类没有默认构造函数,则将无法工作,因此我必须修复它。

【问题讨论】:

  • eE 用于科学记数法。例如1e2是100。当一个数字没有跟在e后面时,它是无效的。
  • 嗯,字符eE 可以用科学计数法来表示浮点数。因此,cin 将这些字符视为它试图提取的 double 值的一部分是有道理的。
  • 我假设第一个 if 用于防止使用它不支持的类型调用 println。但是,尝试将getInput 与其中一种类型一起使用,您会发现if 没有帮助。那些println 仍然会尝试编译并失败。
  • 仅供参考:while (cin.fail()) 如果我们进入这个循环,我们就有可能永远摆脱它。
  • 对于一个minimal可编译的例子,问题中的大部分代码都是不相关的,应该被删除。

标签: c++ templates


【解决方案1】:

如果您输入一个数字后跟一个e(或E),那么cin 会要求以科学记数法输入一个数字。如果在e 之后没有整数(负数或其他),那么这不是有效的科学记数法,cin 将无法将其读取为浮点数floatdouble

该错误类似于您输入类似3.. 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多