c ++ parsing int de la chaîne

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 .