Juste une petite question. J'ai regardé un peu sur Internet et j'ai trouvé quelques solutions, mais aucune d'entre elles n'a encore fonctionné. Vous cherchez à convertir une chaîne en entier et je ne parle pas de codes ASCII.
Pour une analyse rapide, nous sommes passés dans une équation sous forme de chaîne. Nous devons le décomposer, le formater correctement et résoudre les équations linéaires. Maintenant, en disant cela, je ne suis pas en mesure de convertir une chaîne en entier.
Je sais que la chaîne sera au format (-5) ou (25) etc. donc c'est définitivement un int. Mais comment extraire cela d'une chaîne?
Je pensais notamment à exécuter une boucle for / while dans la chaîne, à rechercher un chiffre, à extraire tous les chiffres après cela, puis à voir s'il y avait un `` - '', s'il y en a un, à multiplier l'int par - 1.
Cela semble un peu trop compliqué pour un si petit problème. Des idées?
atoi()
?std::string
myString
et queatoi
vous voulez l' utiliser , alors vous voulez direatoi(myString.c_str())
.Réponses:
En C ++ 11, il y a de belles nouvelles fonctions de conversion de
std::string
à un type numérique.Donc au lieu de
vous pouvez utiliser
où
str
est votre numérostd::string
.Il y a version pour toutes les saveurs de chiffres:
long stol(string)
,float stof(string)
,double stod(string)
, ... voir http://en.cppreference.com/w/cpp/string/basic_string/stolla source
"11x"
en entier11
.from_chars
C ++ 17? Il est censé être des ordres de grandeur plus rapides questoi
.stoi
devrait être préféré. Voir Pourquoi ne devrais-je pas utiliser atoi ()?Pour être complètement correct, vous voudrez vérifier les drapeaux d'erreur.
la source
-5
de(-5)
.Les options possibles sont décrites ci-dessous:
1. Première option: sscanf ()
Il s'agit d'une erreur (également affichée par cppcheck) car "scanf sans limites de largeur de champ peut planter avec d'énormes données d'entrée sur certaines versions de libc" (voir ici et ici ).
2. Deuxième option: std :: sto * ()
Cette solution est courte et élégante, mais elle n'est disponible que sur les compilateurs compatibles C ++ 11.
3. Troisième option: sstreams
Cependant, avec cette solution, il est difficile de distinguer les mauvaises entrées (voir ici ).
4. Quatrième option: lexical_cast de Boost
Cependant, ce n'est qu'un wrapper de
sstream
, et la documentation suggère d'utilisersstream
pour une meilleure gestion des erreurs (voir ici ).5. Cinquième option: strto * ()
Cette solution est très longue, en raison de la gestion des erreurs, et elle est décrite ici. Comme aucune fonction ne renvoie un entier simple, une conversion est nécessaire en cas d'entier (voir ici comment cette conversion peut être réalisée).
6. Sixième option: Qt
Conclusions
En résumé, la meilleure solution est C ++ 11
std::stoi()
ou, comme deuxième option, l'utilisation de bibliothèques Qt. Toutes les autres solutions sont déconseillées ou boguées.la source
utilisez la fonction atoi pour convertir la chaîne en un entier:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
la source
atoi
.strtol
fait toutatoi
, mais mieux, et échoue en toute sécurité.Qu'en est-il de Boost.Lexical_cast ?
Voici leur exemple:
la source
Certes, ma solution ne fonctionnerait pas pour les entiers négatifs, mais elle extraira tous les entiers positifs du texte d'entrée contenant des entiers. Il utilise les
numeric_only
paramètres régionaux:Texte de saisie:
Entiers de sortie:
La classe
numeric_only
est définie comme:Démo complète en ligne: http://ideone.com/dRWSj
la source
C'est probablement un peu exagéré, mais cela
boost::lexical_cast<int>( theString )
devrait très bien fonctionner.la source
boost::lexical_cast<int>( theString )
(oùtheString
est le nom de la variable qui contient la chaîne que vous souhaitez convertirint
).atoi
est une fonction intégrée qui convertit une chaîne en entier, en supposant que la chaîne commence par une représentation entière.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
la source
atoi
, utilisezstrtol
plutôt.Sous Windows, vous pouvez utiliser:
strtol
, vousstringstream
devez spécifier la base si vous avez besoin d'interpréter hexadécimal.la source
Eh bien, beaucoup de réponses, beaucoup de possibilités. Ce qui me manque ici, c'est une méthode universelle qui convertit une chaîne en différents types intégraux C ++ (court, int, long, bool, ...). J'ai trouvé la solution suivante:
Voici des exemples d'utilisation:
Pourquoi ne pas simplement utiliser l'opérateur de sortie stringstream pour convertir une chaîne en un type intégral? Voici la réponse: disons qu'une chaîne contient une valeur qui dépasse la limite du type intégral voulu. Par exemple, sur Wndows 64 max int est 2147483647. Attribuons à une chaîne une valeur max int + 1: chaîne str = "2147483648". Maintenant, lors de la conversion de la chaîne en int:
x devient 2147483647, ce qui est définitivement une erreur: la chaîne "2147483648" n'était pas censée être convertie en int 2147483647. La fonction fournie àIntegralType détecte ces erreurs et lève une exception.
la source
De http://www.cplusplus.com/reference/string/stoi/
Production:
2001, A Space Odyssey: 2001 et [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
la source
Mon code:
la source
la source
Pour convertir de la représentation sous forme de chaîne en valeur entière, nous pouvons utiliser std :: stringstream.
si la valeur convertie est hors limites pour le type de données entier, elle renvoie INT_MIN ou INT_MAX.
De plus, si la valeur de chaîne ne peut pas être représentée comme un type de données int valide, 0 est renvoyé.
Sortie: 50
Selon la sortie ci-dessus, nous pouvons le voir converti des numéros de chaîne en nombre entier.
Source et plus à la chaîne en int c ++
la source
Version une ligne:
long n = strtol(s.c_str(), NULL, base);
.(
s
est la chaîne etbase
est unint
telle que 2, 8, 10, 16.)Vous pouvez vous référer à ce lien pour plus de détails
strtol
.L'idée de base est d'utiliser la
strtol
fonction, qui est incluse danscstdlib
.Étant donné
strtol
que seules les poignées avecchar
tableau, nous devons convertirstring
enchar
tableau. Vous pouvez vous référer à ce lien .Un exemple:
qui produira:
la source
il existe un autre moyen simple: supposons que vous ayez un personnage comme
c='4'
vous pouvez donc effectuer l'une des étapes suivantes:1er: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
la deuxième façon:
q=c-'0'; the same , character '0' means 48
la source
string
àint
plutôt que dechar
àstring
.