如何让cin只取数字
这是代码
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; }
我的问题是,当我input像1x这样的东西,那么1被视为input,而不会注意到剩下的字符,另一个运行。 有什么办法可以使它与任何实数例如1.8?
我会使用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; }
当cin遇到一个input时,它不能正确读入指定的variables(比如将一个字符input到一个整数variables中),它会进入一个错误状态,并将input留在缓冲区中。
你必须做好几件事来正确处理这种情况。
- 你必须testing这个错误状态。
- 您必须清除错误状态。
- 您必须交替处理生成错误状态的input数据,或者将其清除并重新提示用户。
下面的代码提供了做这三件事情的众多方法之一。
#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; }
你可以把一些大的值传给cin.ignore,比如1000,它可能在所有的实际用途上performance得完全一样。
您也可以在input尝试之后testingcin,并以这种方式处理,例如if(!cin){//清除错误}。
查看其他成员函数的istream引用来处理stream状态: http : //cplusplus.com/reference/iostream/istream/