如何在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 } 

cinfailbit被设置时,使用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 ; }