检查输入是否是C++中的数字或字符串

WES*_*RUK 8 c++ string integer user-input string-conversion

我写了下面的代码来检查输入(answer3)是一个数字还是字符串,如果它不是一个数字,它应该返回"仅输入数字",但它返回相同的数字.请建议我一个解决方案.

#include <iostream>
#include <string>
#include <typeinfo>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

using namespace std; 
int main ()
{

string ques1= "Client's Name :";
string ques2 = "Client's Address :";
string ques3 = "Mobile Number :";

char answer1 [80];
string answer2;
int answer3;

     cout<<ques1<<endl;    
     cin>>answer1;      

     cout<<ques2<<endl;    
     cin>>answer2; 

     cout<<ques3<<endl;
     cin>>answer3;

       if (isdigit(answer3))
       {
              cout<<"Correct"<<endl;     

              }

        else
        {
          cout<<"Enter Numbers Only"<<endl;  

            }

 system("pause>null");
 return 0;  

}
Run Code Online (Sandbox Code Playgroud)

Jah*_*hid 8

你可以regex这样做:

#include <regex>

bool isNumber(std::string x){
    std::regex e ("^-?\\d+");
    if (std::regex_match (x,e)) return true;
    else return false;}
Run Code Online (Sandbox Code Playgroud)

如果你想创建isNumber()一个可以接受任何类型输入的泛型函数:

#include <regex>
#include <sstream>

template<typename T>
bool isNumber(T x){
    std::string s;
    std::regex e ("^-?\\d+");
    std::stringstream ss; 
    ss << x;
    ss >>s;
    if (std::regex_match (s,e)) return true;
    else return false;}
Run Code Online (Sandbox Code Playgroud)

上面的isNumber()函数只检查整数,精度(包含点.)的double或float值不会返回true.如果您也想要精度,那么将regex行更改为:

std::regex e ("^-?\\d*\\.?\\d+");
Run Code Online (Sandbox Code Playgroud)

如果您想要更高效的解决方案,请参阅此解决方案.


jrd*_*rd1 7

如果您使用的是C++ 98,则可以使用stringstreams(#include <sstream>):

std::string s = "1234798797";
std::istringstream iss(s);

int num = 0;

if (!(iss >> num).fail()) {
    std::cout << num << std::endl;
}
else {
    std::cerr << "There was a problem converting the string to an integer!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果您可以使用boost,则可以使用lexical_cast(#include <boost/lexical_cast.hpp>):

std::string s = "1234798797";
int num = boost::lexical_cast<int>(si);//num is 1234798797
std::cout << num << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果C++ 11是提供给你,你可以使用内置std::stoi 函数从<string>:

std::string s = "1234798797";
int mynum = std::stoi(s);
std::cout << mynum << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出:

1234798797
Run Code Online (Sandbox Code Playgroud)