Comment concaténer un std :: ssortingng et un int?

Je pensais que ce serait très simple mais cela présente des difficultés. Si j’ai

std::ssortingng name = "John"; int age = 21; 

Comment puis-je les combiner pour obtenir une seule chaîne "John21" ?

Par ordre alphabétique:

 std::ssortingng name = "John"; int age = 21; std::ssortingng result; // 1. with Boost result = name + boost::lexical_cast(age); // 2. with C++11 result = name + std::to_ssortingng(age); // 3. with FastFormat.Format fastformat::fmt(result, "{0}{1}", name, age); // 4. with FastFormat.Write (requires #include ) fastformat::write(result, name, age); // 5. with the {fmt} library result = fmt::format("{}{}", name, age); // 6. with IOStreams std::ssortingngstream sstm; sstm << name << age; result = sstm.str(); // 7. with itoa char numstr[21]; // enough to hold all numbers up to 64-bits result = name + itoa(age, numstr, 10); // 8. with sprintf char numstr[21]; // enough to hold all numbers up to 64-bits sprintf(numstr, "%d", age); result = name + numstr; // 9. with STLSoft's integer_to_string char numstr[21]; // enough to hold all numbers up to 64-bits result = name + stlsoft::integer_to_string(numstr, 21, age); // 10. with STLSoft's winstl::int_to_string() result = name + winstl::int_to_string(age); // 11. With Poco NumberFormatter result = name + Poco::NumberFormatter().format(age); 
  1. est sûr, mais lent; nécessite Boost (en-tête seulement); la plupart / toutes les plates-formes
  2. est sûr, nécessite C ++ 11 ( to_ssortingng () est déjà inclus dans #include )
  3. est sûr et rapide; nécessite FastFormat , qui doit être compilé; la plupart / toutes les plates-formes
  4. est sûr et rapide; nécessite FastFormat , qui doit être compilé; la plupart / toutes les plates-formes
  5. est sûr et rapide; requirejs la bibliothèque {fmt} , qui peut être compilée ou utilisée dans un mode en-tête uniquement; la plupart / toutes les plates-formes
  6. sûr, lent et verbeux; nécessite #include (à partir du standard C ++)
  7. est fragile (vous devez fournir un tampon suffisamment grand), rapide et verbeux; itoa () est une extension non standard, et il n'est pas garanti qu'elle soit disponible pour toutes les plates-formes
  8. est fragile (vous devez fournir un tampon suffisamment grand), rapide et verbeux; ne nécessite rien (C ++ standard); toutes les plateformes
  9. est fragile (vous devez fournir un tampon suffisamment grand), probablement la conversion la plus rapide possible , verbeuse; nécessite STLSoft (en-tête uniquement); la plupart / toutes les plates-formes
  10. safe-ish (vous n'utilisez pas plus d'un appel int_to_ssortingng () dans une seule déclaration), rapide; nécessite STLSoft (en-tête uniquement); Windows uniquement
  11. est sûr, mais lent; nécessite Poco C ++ ; la plupart / toutes les plates-formes

En C ++ 11, vous pouvez utiliser std::to_ssortingng , par exemple:

 auto result = name + std::to_ssortingng( age ); 

Si vous avez Boost, vous pouvez convertir l’entier en une chaîne en utilisant boost::lexical_cast(age) .

Une autre méthode consiste à utiliser des chaînes de caractères:

 std::ssortingngstream ss; ss << age; std::cout << name << ss.str() << std::endl; 

Une troisième approche consisterait à utiliser snprintf ou snprintf partir de la bibliothèque C.

 char buffer[128]; snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age); std::cout << buffer << std::endl; 

D'autres affiches suggèrent d'utiliser itoa . Ceci n'est PAS une fonction standard, donc votre code ne sera pas portable si vous l'utilisez. Il y a des compilateurs qui ne le supportent pas.

 std::ossortingngstream o; o << name << age; std::cout << o.str(); 
 #include  #include  #include  using namespace std; ssortingng itos(int i) // convert int to ssortingng { ssortingngstream s; s << i; return s.str(); } 

Volé sans vergogne à http://www.research.att.com/~bs/bs_faq2.html .

C’est le moyen le plus simple:

 ssortingng s = name + std::to_ssortingng(age); 

Il me semble que la réponse la plus simple consiste à utiliser la fonction sprintf :

 sprintf(outSsortingng,"%s%d",name,age); 

Si vous avez C ++ 11, vous pouvez utiliser std::to_ssortingng .

Exemple:

 std::ssortingng name = "John"; int age = 21; name += std::to_ssortingng(age); std::cout << name; 

Sortie:

 John21 
 #include  #include  using namespace std; ssortingng concatenate(std::ssortingng const& name, int i) { ssortingngstream s; s << name << i; return s.str(); } 

Je n’ai pas assez de karma pour commenter (encore moins édité), mais le post de Jay (actuellement le plus voté à 27) contient une erreur. Ce code:

 std::ssortingngstream ss; ss << age; std::cout << name << ss.str() << std::endl; 

Ne résout pas le problème déclaré de création d'une chaîne composée d'une chaîne concaténée et d'un entier. Je pense que Jay voulait dire quelque chose comme ça:

 std::ssortingngstream ss; ss << name; ss << age; std::cout << "built string: " << ss.str() << std::endl; 

La dernière ligne est juste pour imprimer le résultat et montre comment accéder à la chaîne concaténée finale.

Herb Sutter a un bon article à ce sujet: “The Ssortingng Formatters of Manor Farm” . Il couvre Boost::lexical_cast , std::ssortingngstream , std::strstream (qui est obsolète) et snprintf vs snprintf .

 #include  template  inline std::ssortingng to_ssortingng (const T& t) { std::ssortingngstream ss; ss << t; return ss.str(); } 

Alors votre utilisation ressemblerait à quelque chose comme ça

  std::ssortingng szName = "John"; int numAge = 23; szName += to_ssortingng(numAge); cout << szName << endl; 

Googled [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 modèle de l’ operator+ :

 template  std::ssortingng operator+(L left, R right) { std::ossortingngstream os; os << left << right; return os.str(); } 

Ensuite, vous pouvez écrire vos concaténations de manière simple:

 std::ssortingng foo("the answer is "); int i = 42; std::ssortingng bar(foo + i); std::cout << bar << std::endl; 

Sortie:

 the answer is 42 

Ce n'est pas le moyen le plus efficace, mais vous n'avez pas besoin du moyen le plus efficace, à moins de faire beaucoup de concaténation dans une boucle.

Si vous utilisez MFC, vous pouvez utiliser un CSsortingng

 CSsortingng nameAge = ""; nameAge.Format("%s%d", "John", 21); 

C ++ géré a également un formateur de chaîne .

Le std :: ossortingngstream est une bonne méthode, mais parfois cette astuce supplémentaire peut être utile pour transformer la mise en forme en une seule ligne:

 #include  #define MAKE_STRING(tokens) /****************/ \ static_cast( \ std::ossortingngstream().flush() << tokens \ ).str() \ /**/ 

Maintenant, vous pouvez formater des chaînes comme ceci:

 int main() { int i = 123; std::ssortingng message = MAKE_STRING("i = " << i); std::cout << message << std::endl; // prints: "i = 123" } 

Comme une question liée à Qt a été fermée en faveur de celle-ci, voici comment procéder en utilisant Qt:

 QSsortingng ssortingng = QSsortingng("Some ssortingng %1 with an int somewhere").arg(someIntVariable); ssortingng.append(someOtherIntVariable); 

La variable ssortingng a maintenant la valeur someIntVariable à la place de% 1 et la valeur someOtherIntVariable à la fin.

Vous pouvez concaténer int en chaîne en utilisant l’astuce simple ci-dessous, mais notez que cela ne fonctionne que lorsque le nombre entier est d’un seul chiffre, sinon ajoutez un nombre entier par chiffre à cette chaîne.

 ssortingng name = "John"; int age = 5; char temp=5+'0'; name=name+temp; cout< 

Réponse commune: itoa ()

C’est mauvais. itoa est non standard, comme indiqué ici .

Il y a plus d’options possibles pour concaténer un entier (ou un autre object numérique) avec une chaîne. C’est Boost.Format

 #include  #include  int main() { using boost::format; int age = 22; std::ssortingng str_age = str(format("age is %1%") % age); } 

et Karma de Boost.Spirit (v2)

 #include  #include  #include  int main() { using namespace boost::spirit; int age = 22; std::ssortingng str_age("age is "); std::back_insert_iterator sink(str_age); karma::generate(sink, int_, age); return 0; } 

Boost.Spirit Karma prétend être l’une des options les plus rapides pour la conversion de nombre entier en chaînes .

Si vous voulez sortir un char * et utiliser ssortingngstream selon ce que les répondants ci-dessus ont décrit, faites par exemple:

 myFuncWhichTakesPtrToChar(ss.str().c_str()); 

Comme ce que renvoie ssortingngstream via str () est une chaîne standard, vous pouvez alors appeler c_str () pour obtenir le type de sortie souhaité.

Il y a une fonction que j’ai écrite, qui prend en paramètre le nombre int et le convertit en chaîne littérale, cette fonction dépend d’une autre fonction qui convertit un seul chiffre en son équivalent de caractère:

 char intToChar ( int num) { if ( num < 10 && num >= 0) { return num + 48; //48 is the number that we add to an integer number to have its character equivalent (see the unsigned ASCII table) } else { return '*'; } } ssortingng intToSsortingng ( int num) { int digits = 0, process, single; ssortingng numSsortingng; process = num; //The following process the number of digits in num while ( process != 0) { single = process % 10; // single now hold the rightmost portion of the int process = (process - single)/10; // take out the rightmost number of the int ( it's a zero in this portion of the int), then divide it by 10 // The above combinasion eliminates the rightmost portion of the int digits ++; } process = num; //Fill the numSsortingng with '*' times digits for ( int i = 0; i < digits; i++) { numString += '*'; } for ( int i = digits-1; i >= 0; i-- ) { single = process % 10; numSsortingng[i] = intToChar ( single); process = ( process - single) / 10; } return numSsortingng; } 

Voici comment implémenter un int dans une chaîne en utilisant les facettes d’parsing et de mise en forme de la bibliothèque IOStreams.

 #include  #include  #include  template  struct erasable_facet : Facet { erasable_facet() : Facet(1) { } ~erasable_facet() { } }; void append_int(std::ssortingng& s, int n) { erasable_facet>> facet; std::ios str(nullptr); facet.put(std::back_inserter(s), str, str.fill(), static_cast(n)); } int main() { std::ssortingng str = "ID: "; int id = 123; append_int(str, id); std::cout << str; // ID: 123 } 

Une autre façon simple de le faire est:

 name.append(age+""); cout << name; 

Sans C ++ 11, pour un petit nombre entier, j’ai trouvé que c’était tout ce dont j’avais besoin:

déclarer / inclure une variante du suivant quelque part:

 const ssortingng intToSsortingng[10] = {"0","1","2","3","4","5","6","7","8","9"}; 

puis:

 ssortingng str = intToSsortingng[3]+" + "+intToSsortingng[4]+" = "+intToSsortingng[7]; //str equals "3 + 4 = 7" 

Fonctionne avec des énumérations aussi.

La réponse détaillée est enfouie sous d’autres réponses, en refaisant partie:

 #include  // cout #include  // ssortingng, to_ssortingng(some_number_here) using namespace std; int main() { // using constants cout << "John" + std::to_string(21) << endl; // output is: // John21 // using variables string name = "John"; int age = 21; cout << name + to_string(age) << endl; // output is: // John21 } 

Avec la bibliothèque {fmt} :

 auto result = fmt::format("{}{}", name, age); 

Un sous-ensemble de la bibliothèque est proposé pour normalisation sous la forme P0645 Format de texte et, s’il est accepté, ce qui suit deviendra:

 auto result = std::format("{}{}", name, age); 

Disclaimer : Je suis l’auteur de la bibliothèque {fmt}.

Ce problème peut être résolu de différentes manières:

1). Convertissez le nombre en chaîne en utilisant to_ssortingng (i).

2). Utiliser des stream de chaînes.

Code: –

  #include  #include  #include #include using namespace std; int main(){ ssortingng name = "John"; int age=21; ssortingng answer1=""; // Method 1). ssortingng s1=to_ssortingng(age). ssortingng s1=to_ssortingng(age); // know the integer get converted into ssortingng // where as we know that concatenation can easily be done using '+' in c++ answer1=name+s1; cout< 

// J'espère que cela aide

  • std :: ossortingngstream
 #include  std::ossortingngstream s; s << "John " << age; std::string query(s.str()); 
  • std :: to_ssortingng (C ++ 11)
 std::ssortingng query("John " + std::to_ssortingng(age)); 
  • boost :: lexical_cast
 #include  std::ssortingng query("John " + boost::lexical_cast(age)); 

Proposer une solution alternative pour les personnes comme moi qui n’ont peut-être pas access à C ++ 11 et à d’autres bibliothèques / en-têtes comme boost. Une simple conversion fonctionne comme ceci:

Exemple: le nombre est 4, pour convertir 3 en ascii, on peut simplement utiliser le code:
char a = ‘0’ + 4

Cela stockera immédiatement 4 comme un caractère dans un.

De là, on peut simplement concaténer un avec le rest de la chaîne.

Je suis un utilisateur débutant en C ++ et j’ai trouvé cela le plus simple:

 cout << name << age; 

Cela concaténera avec succès le nom et l'âge, le résultat sera "John21".

Cependant, il doit y avoir une raison pour laquelle personne n'a dit cela; Je pense qu'il y a peut-être un défaut, même si je n'en ai pas connu jusqu'à présent.

EDIT: Je me suis rendu compte que ce n’était pas forcément la bonne réponse, mais je la garderai ici au cas où des débutants en C ++ voudraient savoir comment sortir des chaînes concaténées.