我想验证用户输入是否为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");
}
答案 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,所以把字符串放到字符串流中,然后你可以从中读取一个浮点数。