significado - funciones de cadenas de caracteres en c++
Compruebe si la entrada es un nĂºmero o cadena en C++ (7)
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;
}
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).
Puede verificar si tiene un número entero cambiando la lógica de comprobación:
if ( cin.fail() )
{
cout<<"Correct"<<endl;
}
else
{
cout<<"Enter Numbers Only"<<endl;
}
La función isdigit () se usa 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();
}
Si está usando C ++ 98 , puede 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 hay impulso disponible para usted , puede 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 , puede usar la función incorporada std::stoi
de <string>
:
std::string s = "1234798797";
int mynum = std::stoi(s);
std::cout << mynum << std::endl;
SALIDAS:
1234798797
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 comprobar si una cadena es un número es la función std::stod
, 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 que comienzan con números (pero no son números) se convertirán en números. Esto se puede solucionar fácilmente usando std::to_string
en el número devuelto y comparándolo con la cadena original.
El fenómeno de interés es que isdigit
requiere char
para ser lanzado a unsigned char
. (También vea aquí ).
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:
- El espacio en blanco hará que devuelva falso.
-
NAN
eINF
harán que devuelva falso (para ser exactos, cualquier carácter excepto el exponente válido lo hará devolver falso). Si quieres permitirnan
einf
, elimina el|| std::isalpha(s[0])
|| std::isalpha(s[0])
parte. - la forma científica está permitida, es decir, 1e + 12 devolverá verdadero.
- Double / float o entero devolverá verdadero.
- Esto es más eficiente que la respuesta de expresiones regulares . (Regex es pesado).
Puede 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 desea hacer que isNumber()
una función genérica que pueda 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;}
La función isNumber()
anterior isNumber()
busca números enteros, el valor doble o flotante con precisión (que contiene puntos) no devolverá verdadero. Si también quieres precisión, cambia la línea de regex
a:
std::regex e ("^-?//d*//.?//d+");
Si quieres una solución más eficiente, mira esta .