Étant donné que cette question est posée chaque semaine, cette FAQ pourrait aider de nombreux utilisateurs.
Comment convertir un entier en chaîne en C ++
comment convertir une chaîne en un entier en C ++
comment convertir un nombre à virgule flottante en une chaîne en C ++
comment convertir une chaîne en nombre à virgule flottante en C ++
Réponses:
Mise à jour pour C ++ 11
À partir de la
C++11
norme, la conversion chaîne en nombre et vice-versa est intégrée à la bibliothèque standard. Toutes les fonctions suivantes sont présentes dans<string>
(conformément au paragraphe 21.5).chaîne en numérique
Chacun de ceux-ci prend une chaîne en entrée et essaiera de la convertir en nombre. Si aucun nombre valide n'a pu être construit, par exemple parce qu'il n'y a pas de données numériques ou parce que le nombre est hors limites pour le type, une exception est levée (
std::invalid_argument
oustd::out_of_range
).Si la conversion a réussi et
idx
ne l'est pas0
,idx
contiendra l'index du premier caractère qui n'a pas été utilisé pour le décodage. Cela peut être un index derrière le dernier caractère.Enfin, les types intégraux permettent de spécifier une base, pour les chiffres supérieurs à 9, l'alphabet est supposé (
a=10
jusqu'àz=35
). Vous pouvez trouver plus d'informations sur la mise en forme exacte qui peut être analysée ici pour les nombres à virgule flottante , les entiers signés et les entiers non signés .Enfin, pour chaque fonction, il existe également une surcharge qui accepte un
std::wstring
comme premier paramètre.numérique en chaîne
Ceux-ci sont plus simples, vous passez le type numérique approprié et vous récupérez une chaîne. Pour les options de formatage, vous devez revenir à l'option stringsream C ++ 03 et utiliser des manipulateurs de flux, comme expliqué dans une autre réponse ici.
Comme indiqué dans les commentaires, ces fonctions reviennent à une précision de mantisse par défaut qui n'est probablement pas la précision maximale. Si plus de précision est requise pour votre application, il est également préférable de revenir à d'autres procédures de formatage de chaîne.
Il existe également des fonctions similaires définies qui sont nommées
to_wstring
, elles renverront un fichierstd::wstring
.la source
std::to_string
perd beaucoup de précision pour les types à virgule flottante. Par exemple,double f = 23.4323897462387526; std::string f_str = std::to_string(f);
renvoie une chaîne de 23,432390. Cela rend impossible d'aller-retour des valeurs en virgule flottante en utilisant ces fonctions.sprintf(buf, fmt, val)
avec un spécificateur de format de "% d " , "% u " , "% ld " , " % lu " , "% lld " , "% llu " , "% f " , "% f " ou "% Lf " , respectivement, oùbuf
désigne un tampon de caractères interne de taille suffisante. " J'ai jeté un coup d'œil au C99 standard pour printf et je pense que le nombre de décimales dépend#define DECIMAL_DIG
defloat.h .Comment convertir un nombre en chaîne en C ++ 03
itoa
ouitof
car elles ne sont pas standard et donc non portables.Utiliser des flux de chaînes
Notez que vous pouvez également utiliser des flux de chaînes pour convertir des nombres à virgule flottante en chaîne, et également pour formater la chaîne comme vous le souhaitez, comme avec
cout
Vous pouvez utiliser des manipulateurs de flux, tels que
std::endl
,std::hex
et des fonctionsstd::setw()
,std::setprecision()
etc. avec des flux de chaînes exactement de la même manière qu'aveccout
Ne confondez pas
std::ostringstream
avecstd::ostrstream
. Ce dernier est obsolèteUtilisez la distribution lexicale boost . Si vous n'êtes pas familier avec boost, c'est une bonne idée de commencer avec une petite bibliothèque comme celle-ci lexical_cast. Pour télécharger et installer boost et sa documentation, allez ici . Bien que boost ne soit pas dans la norme C ++, de nombreuses bibliothèques de boost sont finalement standardisées et boost est largement considéré comme les meilleures bibliothèques C ++.
La distribution lexicale utilise des flux en dessous, donc fondamentalement cette option est la même que la précédente, juste moins verbeuse.
Comment convertir une chaîne en nombre en C ++ 03
L'option la plus légère, héritée de C, est les fonctions
atoi
(pour les entiers (alphabétique à entier)) etatof
(pour les valeurs à virgule flottante (alphabétique à float)). Ces fonctions prennent une chaîne de style C comme argument (const char *
) et par conséquent, leur utilisation peut être considérée comme une mauvaise pratique C ++. cplusplus.com a une documentation facile à comprendre sur atoi et atof, y compris comment ils se comportent en cas de mauvaise saisie. Cependant, le lien contient une erreur en ce que selon la norme si le nombre d'entrée est trop grand pour tenir dans le type de cible, le comportement est indéfini.Utilisez des flux de chaînes (cette fois, des flux de chaînes d'entrée
istringstream
). Encore une fois, istringstream est utilisé commecin
. Encore une fois, ne confondez pasistringstream
avecistrstream
. Ce dernier est obsolète.Utilisez la distribution lexicale boost .
En cas de mauvaise entrée,
lexical_cast
lance une exception de typeboost::bad_lexical_cast
la source
atoi
n'est pas excellente, elle est incorrecte. Il ne mentionne pas que si la valeur numérique de la chaîne ne peut pas être représentée dansint
, alors le comportement n'est pas défini. Il dit à la place que les valeurs hors limites sont fixées àINT_MAX
/INT_MIN
, ce que je ne trouve ni dans C ++ 03 ni dans C89. Pour les entrées non approuvées / non vérifiées, ou lors de l'utilisation de bases que les flux ne prennent pas en charge, vous avez besoin destrtol
ce qui a défini le comportement d'erreur. Et des commentaires similaires pouratof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Les fonctions atoi [...] renvoient la valeur convertie.". cplusplus.com est connu pour être une incroyable mauvaise source d'informations pour les débutants.istr >> i1 >> f >> i2;
rate gravement un test de succès.std::to_string
En C ++ 17, les nouvelles fonctions std :: to_chars et std :: from_chars sont introduites dans l'en-tête charconv .
De std :: to_chars , même chose pour std :: from_chars .
Bien qu'il ne soit pas entièrement implémenté par les compilateurs, il le sera certainement.
la source
J'ai volé cette classe pratique quelque part ici à StackOverflow pour convertir tout ce qui peut être diffusé en chaîne:
Et puis vous l'utilisez comme;
Assez chouette!
J'utilise également cette fonction pour convertir des chaînes en quelque chose de streamable, mais ce n'est pas très sûr si vous essayez d'analyser une chaîne ne contenant pas de nombre; (et ce n'est pas aussi intelligent que le dernier non plus)
Utilisé comme:
Vous pouvez également vouloir des versions pour wstrings.
la source