Duplication possible:
Comment parsingr une chaîne de caractères dans un int en C ++?
J’ai fait des recherches et certaines personnes disent utiliser atio et d’autres disent que c’est mauvais, et je ne peux pas le faire fonctionner de toute façon.
Donc, je veux juste demander à plat, quelle est la bonne façon de convertir une chaîne en int.
ssortingng s = "10"; int i = s....?
Merci!
En C ++ 11, utilisez std::stoi
comme:
std::ssortingng s = "10"; int i = std::stoi(s);
Notez que std::stoi
lancera une exception de type std::invalid_argument
si la conversion ne peut être effectuée ou std::out_of_range
si la conversion entraîne un débordement (c’est-à-dire si la valeur de la chaîne est trop grande pour le type int
). Vous pouvez utiliser std::stol
ou std:stoll
bien que si int
semble trop petit pour la chaîne d’entrée.
En C ++ 03/98, l’un des éléments suivants peut être utilisé:
std::ssortingng s = "10"; int i; //approach one std::issortingngstream(s) >> i; //i is 10 after this //approach two sscanf(s.c_str(), "%d", &i); //i is 10 after this
Notez que les deux approches ci-dessus échoueraient pour l’entrée s = "10jh"
. Ils retourneront 10 au lieu de signaler une erreur. L’approche sûre et robuste consiste donc à écrire votre propre fonction qui parsing la chaîne d’entrée et vérifie chaque caractère pour vérifier s’il s’agit d’un chiffre ou non, puis travaillez en conséquence. Voici une implémentation robuste (pas encore testée):
int to_int(char const *s) { if ( s == NULL || *s == '\0' ) throw std::invalid_argument("null or empty ssortingng argument"); bool negate = (s[0] == '-'); if ( *s == '+' || *s == '-' ) ++s; if ( *s == '\0') throw std::invalid_argument("sign character only."); int result = 0; while(*s) { if ( *s >= '0' && *s <= '9' ) { result = result * 10 - (*s - '0'); //assume negative number } else throw std::invalid_argument("invalid input string"); ++s; } return negate ? result : -result; //-result is positive! }
Cette solution est une version légèrement modifiée de mon autre solution .
Vous pouvez utiliser boost :: lexical_cast :
#include #include int main( int argc, char* argv[] ){ std::ssortingng s1 = "10"; std::ssortingng s2 = "abc"; int i; try { i = boost::lexical_cast( s1 ); } catch( boost::bad_lexical_cast & e ){ std::cout << "Exception caught : " << e.what() << std::endl; } try { i = boost::lexical_cast ( s2 ); } catch( boost::bad_lexical_cast & e ){ std::cout << "Exception caught : " << e.what() << std::endl; } return 0; }
Il n’y a pas de “bonne voie”. Si vous voulez une solution universelle (mais sous-optimale), vous pouvez utiliser un boost :: cast lexical.
Une solution courante pour C ++ consiste à utiliser std :: ostream et << operator. Vous pouvez utiliser une méthode stringstream et stringstream :: str () pour la conversion en chaîne.
Si vous avez vraiment besoin d’un mécanisme rapide (rappelez-vous la règle 20/80), vous pouvez rechercher une solution “dédiée” telle que http://www.partow.net/programming/strtk/index.html
Meilleures salutations,
Marcin
Vous pouvez utiliser issortingngstream .
ssortingng s = "10"; // create an input stream with your ssortingng. issortingngstream is(str); int i; // use is like an input stream is >> i;
Quelques fonctions rapides et pratiques (si vous n’utilisez pas Boost):
template std::ssortingng ToSsortingng(const T& v) { std::ossortingngstream ss; ss << v; return ss.str(); } template T FromSsortingng(const std::ssortingng& str) { std::issortingngstream ss(str); T ret; ss >> ret; return ret; }
Exemple:
int i = FromSsortingng(s); std::ssortingng str = ToSsortingng(i);
Fonctionne pour tous types de stream (flottants, etc.). Vous devrez #include
et éventuellement #include
.