Pregunta Compruebe si la entrada es un número o cadena en C ++


Escribí el siguiente código para verificar si la entrada (answer3) es un número o una cadena, si no es un número, debe devolver "Enter Numbers Only", pero devuelve el mismo incluso para los números. Por favor sugiérame una solución.

#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;  

}

5
2018-02-16 05:21


origen


Respuestas:


Si estás usando C ++ 98, puedes usar 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;
}

Si el impulso está disponible para usted, puedes usar 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;

Si C ++ 11 está disponible para usted, puedes usar el builtin std::stoi  función de <string>:

std::string s = "1234798797";
int mynum = std::stoi(s);
std::cout << mynum << std::endl;

SALIDAS:

1234798797

6
2018-02-16 05:28



Puedes usar regex para hacer esto:

#include <regex>

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

Si quieres hacer isNumber() una función genérica que puede tomar cualquier tipo de entrada:

#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;}

Lo anterior isNumber() la función comprueba solo el valor entero, doble o flotante con precisión (que contiene un punto) .) no devolverá verdadero. Si también quieres precisión, entonces cambia la regex línea a:

std::regex e ("^-?\\d*\\.?\\d+");

Si quieres una solución más eficiente, ver éste.


5
2017-07-06 06:28



La función isdigit () se utiliza para probar solo dígitos (0,1, ..., 9)

use esta función para verificar números

bool is_number(const std::string& s)
{
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

2
2018-02-16 05:34



La entrada a isdigit es un valor entero. Sin embargo, devolverá verdadero (distinto de cero) solo si el valor corresponde a '0' - '9'. Si los convierte a valores enteros, son 48-57. Para todos los demás valores, isdigit devolverá falso (cero).

Puedes verificar si obtuviste un entero cambiando la lógica de verificación:

if ( cin.fail() )
{
   cout<<"Correct"<<endl;     
}
else
{
   cout<<"Enter Numbers Only"<<endl;  
}

1
2018-02-16 05:50



Otra respuesta usando strtod:

bool isNumber(const std::string& s){
   if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
   char * p ;
   strtod(s.c_str(), &p) ;
   return (*p == 0) ;
}

Para poder manejar cualquier tipo de plantilla de uso de parámetros:

#include <sstream>

template<typename T>
bool isNumber(T x){
   std::string s;
   std::stringstream ss; 
   ss << x;
   ss >>s;
   if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
   char * p ;
   strtod(s.c_str(), &p) ;
   return (*p == 0) ;
}

Nota:

  1. El espacio en blanco hará que devuelva falso.
  2. NAN y INF hará que devuelva falso (para ser exactos, cualquier carácter excepto el exponente válido lo hará devolver falso). Si quieres permitir nan y inf, borrar el || std::isalpha(s[0]) parte.
  3. Se permite la forma científica, es decir, 1e + 12 devolverá verdadero.
  4. Double / float o entero devolverá verdadero.
  5. Esto es más eficiente que el respuesta regular. (Regex es pesado).

1
2017-11-24 13:07



El fenómeno del interés son los isdigit requiere char ser echado a unsigned char. (Ver también aquí)


0
2018-02-16 07:04



Esta es una pregunta algo antigua, pero pensé que agregaría mi propia solución que estoy usando en mi código.

Otra forma de verificar si una cadena es un número es la std::stod función, que se ha mencionado, pero la uso de forma un poco diferente. En mi caso de uso, uso un bloque try-catch para verificar si la entrada es una cadena o un número, al igual que con tu código:

...
try {
    double n = stod(answer3);
    //This will only be reached if the number was converted properly.
    cout << "Correct" << endl;
} catch (invalid_argument &ex) {
    cout << "Enter Numbers Only" << endl;
}
...

El principal problema con esta solución es que las cadenas comienzan con números (pero no son todos los números) será ser convertido a numeros Esto se puede arreglar fácilmente usando std::to_string en el número devuelto y comparándolo con la cadena original.


0
2018-03-03 15:27