1

我不太明白这个问题。它希望我编写一个代码,提示并读取一个 double 并重复该过程,直到用户正确输入了一个浮点数。

不是double类型floating point吗?那么这段代码将如何结束呢?

编辑 - 好的,所以也许程序需要接受一个双精度并继续这样做,直到输入的值是一个浮点数。这意味着,只要输入的精度在双精度范围内,而不是浮点数范围内,它就会继续接受输入。但是,如果输入的精度在浮点数范围内,则程序结束。这看起来正确吗?

4

2 回答 2

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()) {
    ...
}
于 2013-09-27T18:59:25.007 回答
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 和数字。为此,您需要编写一个解析器,这将是您收到的真正要求。此要求旨在教您编写解析器而不是交付代码,因此我将其留给您完成。

于 2013-09-27T18:55:11.110 回答