C ++仅使用#iostream检查输入是否为float

时间:2013-10-31 22:42:55

标签: c++

我想验证用户输入是否为Float,程序检查输入是否为float并打印“Number is fine”,否则打印“Number is not fine”并继续循环而不进行失败尝试考虑循环,换句话说,它让他再尝试输入一个浮点数。

问题是一旦用户输入“字符”,程序就会进入无限循环。我真正想要它做的只是打印“数字不好”然后继续。

有人可以告诉我为什么会这样,也请考虑不要使用任何其他库。

#include <iostream>
#include <windows.h>


using namespace std;
int main()
{
    int x;
    float num;
    cout << "Please enter the amount of numbers you wish to enter" << endl;
    cin >>  x;

    cout << "Please enter the numbers" << endl;
    for(int i=0; i < x;) {
        if(!(cin >> num)) {
            cout << "Number isn't fine" << endl;
            continue;
        }
        cout << "Number is fine" << endl;
        ++i;
    }
    system("pause");
}

@Steve您的解决方案使用cin.clear()和cin.ignore

@AndyG感谢您的帮助,但遗憾的是我只限于最简单的方式。

如果有人想知道它将来的样子,那么这是最终的代码。

#include <iostream>
#include <windows.h>

using namespace std;
int main()
{
    int x;
    float num;
    cout << "Please enter the size of numbers" << endl;
    cin >>  x;

    cout << "Please enter the numbers" << endl;
    for(int i=0; i < x;) {
        if(!(cin >> num)) {
            cin.clear();
            cin.ignore();
            cout << "not a float number" << endl;
            continue;
        }
        cout << "Number is fine" << endl;
        ++i;
    }
    system("pause");
}

2 个答案:

答案 0 :(得分:2)

如果cin >> num无法读取数字,则流将进入失败状态(即设置failbit),并且它不会读取导致它的字符失败。你永远不会做任何事情clear()失败状态或ignore()坏数据,所以你永远循环。

答案 1 :(得分:0)

首先尝试将数字作为字符串读取,然后解析字符串以确保所有字符都是数字,并且最多一个字符是句点'。'字符。基本上,首先将字符串验证为浮点数(提出有效和无效的潜在输入,如1.5,1a(无效),5e6,5E6等)。

确保输入为字符串后,您可以安全地将其转换为浮点数。

例如,boost :: lexical_cast http://www.boost.org/doc/libs/1_54_0/doc/html/boost_lexical_cast.html

我看到你不想使用额外的库,但是我假设你可以使用STL,所以把字符串放到字符串流中,然后你可以从中读取一个浮点数。