这是代码
double enter_number()
{
double number;
while(1)
{
cin>>number;
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input " << endl;
}
else
break;
cout<<"Try again"<<endl;
}
return number;
}
我的问题是,当我输入类似1x的内容时,则将1作为输入而不会注意到另一次运行时遗漏的字符。 是否有任何方法使其适用于任何实数,例如1.8
答案 0 :(得分:19)
当cin遇到输入时,它无法正确读入指定的变量(例如将字符输入到整数变量中),它会进入错误状态并将输入留在缓冲区中。
您必须做好几件事才能正确处理这种情况。
以下代码提供了执行这三项操作的众多方法之一。
#include<iostream>
#include<limits>
using namespace std;
int main()
{
cout << "Enter an int: ";
int x = 0;
while(!(cin >> x)){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again: ";
}
cout << "You enterd: " << x << endl;
}
你可以将一些大的值传递给像1000这样的cin.ignore,并且它可能在所有实际用途中表现完全相同。
您也可以在输入尝试后测试cin并以这种方式处理,例如 if(!cin){//清除错误}。
查看其他成员函数的istream引用以处理流状态:http://cplusplus.com/reference/iostream/istream/
答案 1 :(得分:9)
我会使用std::getline
和std::string
来读取整行,然后只有在将整行转换为double时才会跳出循环。
#include <string>
#include <sstream>
int main()
{
std::string line;
double d;
while (std::getline(std::cin, line))
{
std::stringstream ss(line);
if (ss >> d)
{
if (ss.eof())
{ // Success
break;
}
}
std::cout << "Error!" << std::endl;
}
std::cout << "Finally: " << d << std::endl;
}
答案 2 :(得分:0)
我希望使用以下代码。在许多可以清除这个问题的代码中,我认为这是我在网上找到的最合适的代码。
#include <iostream>
#include <limits>
using namespace std;
int main(){
int n;
while(!(cin >> n)) {
cin.clear(); // to clear the buffer memory
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Please enter a valid integer!";
}
cout << "Your Integer: " << n << endl;
return 0;
}
答案 3 :(得分:-3)
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int get_int(void);
int main()
{
puts("Enter a number");
cout<<"The integer is "<<get_int()<<endl;
return 0;
}
int get_int(void)
{
char str[20];
char* end;
int num;
do{
fgets(str,20,stdin);
str[strlen(str)-1]='\0';
num=strtol(str,&end,10);
if(!(*end))
return num;
else
{
puts("Please enter a valid integer");
num=0;
}
}while(num==0);
}
这对于任何整数都适用。它甚至可以检查您是否在整数后面输入空格或其他任何字符。唯一的问题是它不使用std::cin
。但是,std::cin
的问题在于它会忽略整数后的任何空格字符,并很乐意将整数作为输入。