如何在C ++中检查input是否是数字
我想创build一个程序,它接受来自用户的整数input,然后在用户根本不input任何内容时结束(即按下回车键)。 然而,我在validationinput时遇到了麻烦(确保用户input整数,而不是string。atoi()将不起作用,因为整数input可能不止一个数字。
validation这个input的最好方法是什么? 我尝试了类似下面的内容,但我不确定如何完成它:
char input while( cin>>input != '\n') { //some way to check if input is a valid number while(!inputIsNumeric) { cin>>input; } }
当cin
得到input它不能使用,它设置failbit
:
int n; cin >> n; if(!cin) // or if(cin.fail()) { // user didn't input a number cin.clear(); // reset failbit cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input // next, request user reinput }
当cin
的failbit
被设置时,使用cin.clear()
重置stream的状态,然后用cin.ignore()
清除剩余的input,然后请求用户重新input。 只要设置了故障状态并且stream包含错误的input,stream将会行为不端。
检查出std::isdigit()
函数。
与使用的问题
cin>>number_variable;
是当你input123abc值,它会通过,你的variables将包含123。
你可以使用正则expression式,就像这样
double inputNumber() { string str; regex regex_pattern("-?[0-9]+.?[0-9]+"); do { cout << "Input a positive number: "; cin >> str; }while(!regex_match(str,regex_pattern)); return stod(str); }
或者你可以改变regex_pattern来validation任何你想要的。
我发现自己一直在使用boost::lexical_cast
来处理这类事情。 例:
std::string input; std::getline(std::cin,input); int input_value; try { input_value=boost::lexical_cast<int>(input)); } catch(boost::bad_lexical_cast &) { // Deal with bad input here }
这个模式也适用于你自己的类,只要它们满足一些简单的要求(在必要方向上的可扩展性,以及默认和复制构造函数)。
为什么不只是使用scanf (“%i”)并检查它的返回?
我猜ctype.h是你需要看的头文件。 它具有处理数字和字符的众多function。 isdigit或iswdigit是在这种情况下将帮助你的东西。
这里是一个参考: http : //docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/isdigit_xml.html
如果你已经有了string,你可以使用这个函数:
bool isNumber( const string& s ) { bool hitDecimal=0; for( char c : s ) { if( c=='.' && !hitDecimal ) // 2 '.' in string mean invalid hitDecimal=1; // first hit here, we forgive and skip else if( !isdigit( c ) ) return 0 ; // not ., not } return 1 ; }