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