657 votes

Comment puis-je convertir une std::string en int ?

J'ai juste une petite question. J'ai fait un peu de recherche sur Internet et j'ai trouvé quelques solutions, mais aucune n'a encore fonctionné. Je cherche à convertir une chaîne de caractères en un nombre entier et je ne parle pas des codes ASCII.

Pour une rapide mise au point, on nous transmet une équation sous forme de chaîne. Nous devons la décomposer, la formater correctement et résoudre les équations linéaires. Maintenant, en disant cela, je ne suis pas capable de convertir une chaîne en un int.

Je sais que la chaîne de caractères sera au format (-5) ou (25), etc. et qu'il s'agit donc bien d'un nombre entier. Mais comment extraire cela d'une chaîne de caractères ?

J'ai pensé à faire tourner une boucle for/while dans la chaîne de caractères, à vérifier qu'il y a un chiffre, à extraire tous les chiffres suivants et à regarder s'il y a un '-' en tête, et s'il y en a un, à multiplier l'entier par -1.

Cela semble un peu trop compliqué pour un si petit problème. Vous avez des idées ?

10 votes

Avez-vous essayé atoi() ?

3 votes

2 votes

970voto

tgmath Points 2528

En C++11, il y a de nouvelles fonctions de conversion intéressantes de std::string à un type de numéro.

Ainsi, au lieu de

atoi( str.c_str() )

vous pouvez utiliser

std::stoi( str )

donde str est votre numéro comme std::string .

Il existe des versions pour tous les types de chiffres : long stol(string) , float stof(string) , double stod(string) ,... voir http://en.cppreference.com/w/cpp/string/basic_string/stol

9 votes

Pour les problèmes avec std::stoi, voir stackoverflow.com/a/6154614/195527 il convertira "11x" en nombre entier 11 .

5 votes

include <stdlib.h> /* atoi */

8 votes

@CC C'est aussi le comportement de atoi : cplusplus.com/reference/cstdlib/atoi "La chaîne peut contenir des caractères supplémentaires après ceux qui forment le nombre intégral, qui sont ignorés et n'ont aucun effet sur le comportement de cette fonction."

66voto

Winston Ewert Points 17746
std::istringstream ss(thestring);
ss >> thevalue;

Pour être tout à fait correct, vous devez vérifier les drapeaux d'erreur.

2 votes

Cela ne permettra pas d'extraire -5 de (-5) .

0 votes

@Nawaz, les parenthèses sont-elles vraiment là, ou est-ce simplement la façon dont le PO présente ses chaînes de caractères ?

0 votes

Je ne sais pas. Je ne fais que souligner les limites de cette approche.

46voto

brenjt Points 5992

Utiliser la fonction atoi pour convertir la chaîne de caractères en un nombre entier :

string a = "25";

int b = atoi(a.c_str());

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

15 votes

Ne jamais utiliser atoi . strtol fait tout atoi le fait, mais mieux, et échoue en toute sécurité.

10voto

Robᵩ Points 50501

Qu'en est-il Boost.Lexical_cast ?

Voici leur exemple :

L'exemple suivant traite les arguments de ligne de commande comme une séquence de données numériques :

int main(int argc, char * argv[])
{
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector<short> args;

    while(*++argv)
    {
        try
        {
            args.push_back(lexical_cast<short>(*argv));
        }
        catch(bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }
    ...
}

0 votes

Le lien est rompu. Pourriez-vous le réparer ?

3voto

Steve Wellens Points 14348

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X