首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提示进行双读,直到用户正确输入浮点数为止。

提示进行双读,直到用户正确输入浮点数为止。
EN

Stack Overflow用户
提问于 2013-09-27 18:45:58
回答 2查看 543关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-27 18:59:25

当读取格式化值失败时,流进入失败模式,即获得std::ios_base::failbit集。一旦处于失败模式,在状态被clear()编辑之前,流将不会接受任何进一步的输入。一旦清除了错误的输入,就需要丢弃它。这样做的一种方法是将所有字符ignore()到行尾。相应的可能是这样的:

代码语言:javascript
运行
复制
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格式中断的输入,则可以扩展该条件以检查该行中是否有其他字符:

代码语言:javascript
运行
复制
while ((!(std::cin >> value) || std::cin.peek() != '\n') && !std::cin.eof()) {
    ...
}
票数 3
EN

Stack Overflow用户

发布于 2013-09-27 18:55:11

如果使用的是boost,则检查输入(在字符串中)的函数如下所示:

代码语言:javascript
运行
复制
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和数字。为此,您需要编写一个解析器,这将是您收到的真正需求。这个要求的目的是教您编写解析器,而不是交付代码,所以我将把它留给您处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19057931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档