Comment concaténer une std::string et un int?
Je pensais que ce serait vraiment simple, mais elle présente certaines difficultés. Si j'ai
std::string name = "John";
int age = 21;
Comment les combiner pour obtenir une chaîne unique "John21"
?
- Herb Sutter a un bon article sur ce sujet: "La Chaîne de Formatage de Manor Farm". Il couvre
Boost::lexical_cast
,std::stringstream
,std::strstream
(ce qui est déconseillé), etsprintf
vssnprintf
. - Permettez-moi d'ajouter ceci: "j'ai essayé" str = "salut"; str += 5; cout << str; " et vu aucun effet. S'avère que c'appels de l'opérateur+=(char) et ajoute un caractère non imprimable.
Vous devez vous connecter pour publier un commentaire.
Dans l'ordre alphabétique:
#include <string>
)#include <sstream>
(à partir de la norme C++)En C++11, vous pouvez utiliser
std::to_string
, par exemple:Si vous avez le coup de pouce, vous pouvez convertir un entier en une chaîne de caractères à l'aide de
boost::lexical_cast<std::string>(age)
.Une autre façon est d'utiliser des stringstreams:
Une troisième approche serait d'utiliser
sprintf
ousnprintf
de la bibliothèque C.D'autres affiches ont suggéré d'utiliser
itoa
. Ce n'est PAS une fonction standard, de sorte que votre code ne sera pas portable si vous l'utilisez. Il existe des compilateurs qui ne le supportent pas.snprintf
: il est inclus dans C++11.sprintf
dans la réponse, quesnprintf
.Sans vergogne volé http://www.research.att.com/~bs/bs_faq2.html.
s
est une pile variables, la mémoire des
sera libre une fois invoqueritos
.s
devrait allouer à partir d'un segment, etfree
après l'utilisation, à droite?C'est le moyen le plus facile:
Si vous avez le C++11, vous pouvez utiliser
std::to_string
.Exemple:
De sortie:
name += std::to_string(static_cast<long long>(age));
dans VC++ 2010 comme vous pouvez le voir herename += std::to_string(age + 0LL);
à la place?Il me semble que la réponse la plus simple est d'utiliser le
sprintf
fonction:Alors votre utilisation ressemblerait à quelque chose comme ceci
Googlé [et testé :p ]
Si vous souhaitez utiliser
+
pour la concaténation de tout ce qui a un opérateur de sortie, vous pouvez fournir une version du modèle deoperator+
:Ensuite, vous pouvez écrire votre concaténations d'une façon simple:
De sortie:
Ce n'est pas le moyen le plus efficace, mais vous n'avez pas besoin de la manière la plus efficace, sauf si vous faites beaucoup de concaténation à l'intérieur d'une boucle.
std::string
, afin de ne pas être candidat à des expressions où une chaîne de caractères n'est pas convertible dans le besoin type. E. g., cetteoperator+
n'est pas admissible à être utilisé pour+
dansint x = 5 + 7;
. Toutes les choses ont considéré, je ne pourrais pas définir un opérateur comme ça, sans un très de raison convaincante, mais mon but était de proposer une réponse différente de celle des autres.Ce problème peut être fait de plusieurs façons. Je vais le montrer de deux façons:
Convertir le numéro de chaîne à l'aide de
to_string(i)
.L'aide de la chaîne de ruisseaux.
Code:
Si vous êtes à l'aide de MFC, vous pouvez utiliser une CString
Managed C++ dispose également d'un
chaîne de formatage.
Le std::ostringstream est une bonne méthode, mais parfois cette astuce supplémentaire pourrait s'avère pratique la transformation de la mise en forme d'un one-liner:
Maintenant, vous pouvez formater des chaînes de caractères comme ceci:
Comme Qt question a été fermé en faveur de celui-ci, voici comment le faire en utilisant Qt:
La variable de chaîne a maintenant someIntVariable de la valeur à la place de %1 et someOtherIntVariable de la valeur à la fin.
Il y a plus d'options possible d'utiliser pour concaténer entier (ou d'autres numerric objet) avec de la ficelle. Il est Coup de pouce.Format
et le Karma de Coup de pouce.Esprit (v2)
Coup de pouce.Esprit Karma prétend être l'un des option la plus rapide pour l'entier de la chaîne de de conversion.
Réponse Commune: itoa()
Ce qui est mauvais.
itoa
est non standard, comme l'a souligné ici.Ici est une mise en œuvre de la façon d'ajouter un entier à une chaîne à l'aide de l'analyse et de mise en forme des facettes de la IOStreams bibliothèque.
Il y a une fonction que j'ai écrit, qui prend l'int que le nombre de paramètre et de le convertir en une chaîne littérale. Cette fonction est dépendante d'une autre fonction qui convertit un seul chiffre à son char équivalent:
Vous pouvez concaténer int de chaîne en utilisant les données ci-dessous truc simple, mais notez que cela ne fonctionne que lorsque le nombre entier est un seul chiffre. Sinon, ajoutez de l'entier digit par digit à cette chaîne.
Avec le {fmt} bibliothèque:
Un sous-ensemble de la bibliothèque est proposé pour la normalisation comme P0645 Mise En Forme Du Texte et, si elle est acceptée, le ci-dessus devient alors:
Avertissement: je suis l'auteur de l' {fmt} bibliothèque.