tipos float dynamic_cast datos convert conversion cast c++ string integer type-conversion typechecking

float - convert string to int c++



Cómo comprobar std:: string si se trata de un número entero? (3)

El siguiente código convierte un std::string en int y el problema radica en el hecho de que no puede discernir entre un entero verdadero o simplemente una cadena aleatoria. ¿Hay un método sistemático para tratar ese problema?

#include <cstring> #include <iostream> #include <sstream> int main() { std::string str = "H"; int int_value; std::istringstream ss(str); ss >> int_value; std::cout<<int_value<<std::endl; return 0; }

EDIT : esta es la solución que me gusta porque es muy minimalista y elegante. No funciona para números negativos, pero de todos modos solo necesitaba positivos.

#include <cstring> #include <iostream> #include <sstream> int main() { std::string str = "2147483647"; int int_value; std::istringstream ss(str); if (ss >> int_value) std::cout << "Hooray!" << std::endl; std::cout<<int_value<<std::endl; str = "-2147483648"; std::istringstream negative_ss(str); if (ss >> int_value) std::cout << "Hooray!" << std::endl; std::cout<<int_value<<std::endl; return 0; }


Puede intentar usar Boost lexical_cast , emitirá una excepción si el lanzamiento falla.

int number; try { number = boost::lexical_cast<int>(str); } catch(boost::bad_lexical_cast& e) { std::cout << str << "isn''t an integer number" << std::endl; }

EDIT Accorinding a @chris, también puede intentar usar std::stoi desde C ++ 11. std::invalid_argument excepción std::invalid_argument si no se puede realizar ninguna conversión. Puede encontrar más información aquí: std :: stoi


El enfoque de WhozCraig es mucho más agradable y quería ampliarlo utilizando el enfoque que utilizan las preguntas frecuentes de C ++, que es el siguiente:

#include <iostream> #include <sstream> #include <string> #include <stdexcept> class BadConversion : public std::runtime_error { public: BadConversion(std::string const& s) : std::runtime_error(s) { } }; inline int convertToInt(std::string const& s, bool failIfLeftoverChars = true) { std::istringstream i(s); int x; char c; if (!(i >> x) || (failIfLeftoverChars && i.get(c))) throw BadConversion("convertToInt(/"" + s + "/")"); return x; } int main() { std::cout << convertToInt( "100" ) << std::endl ; std::cout << convertToInt( "-100" ) << std::endl ; std::cout << convertToInt( " -100" ) << std::endl ; std::cout << convertToInt( " -100 ", false ) << std::endl ; // The next two will fail std::cout << convertToInt( " -100 ", true ) << std::endl ; std::cout << convertToInt( "H" ) << std::endl ; }

Esto es sólido y sabrá si la conversión falla, también puede optar por fallar en los caracteres restantes.


/* isdigit example */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main () { char str[]="1776ad"; int year; if (isdigit(str[0])) { year = atoi (str); printf ("The year that followed %d was %d./n",year,year+1); } return 0; }