我不太明白这个问题。它希望我编写一个代码,提示并读取double并重复该过程,直到用户正确输入浮点数。
double
不是floating point
的类型吗?那么这段代码将如何结束?
编辑 - 好的,所以也许程序需要接受一个双重并继续这样做,直到输入的值是浮点数。这意味着,只要输入的精度在double的范围内,而不是float的范围内,它将继续输入。但是,如果输入的精度在float的精度范围内,则程序结束。这看起来是否正确?
答案 0 :(得分:3)
当读取格式化值失败时,流进入失败模式,即设置为std::ios_base::failbit
。一旦它处于故障模式,流将不接受任何进一步的输入,直到它的状态得到clear()
。一旦清除,就需要丢弃坏输入。一种方法是ignore()
所有字符,直到行尾。相应的可能如下所示:
double value(0);
while (!(std::cin >> value) && !std::cin.eof()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::stremsize>::max(), '\n');
}
如果给定行上的输入不应包含任何垃圾,例如,考虑输入格式12.3x
已损坏,则可以扩展条件以检查该行上是否还有其他字符:
while ((!(std::cin >> value) || std::cin.peek() != '\n') && !std::cin.eof()) {
...
}
答案 1 :(得分:0)
如果您正在使用boost
检查输入(在字符串中)的函数将如下所示:
static bool isCorrect( const std::string& value )
{
try
{
boost::lexical_cast< double >( value ) ; /* this code only checks */
return true ;
}
catch(...)
{
std::cerr << value << " argument is not double!" << std::endl ;
return false ;
}
}
如果您不能使用任何其他库,那么您需要解析字符串以查看该字符串是否包含数字,可选点,然后是数字,如果您的要求是E型格式,那么它是否后跟E和数字。为此,您需要编写一个解析器,这将是您收到的真正要求。这个要求旨在教你编写解析器而不是提供代码,所以我会留给你做。