Comment concaténer std::string et int en C++ : pièges cachés
\n\nAvez-vous déjà écrit quelque chose comme "Hello" + 42 en C++ et obtenu, au lieu du "Hello42" attendu, un étrange ensemble de caractères ? Si oui, vous n'êtes pas seul. Cette question sur Stack Overflow a recueilli des dizaines de milliers de vues, et ce n'est pas sans raison. En C++, la concaténation d'une chaîne et d'un nombre n'est pas une tâche aussi triviale qu'en Python ou JavaScript. Il faut connaître quelques astuces.
Dans cet article, nous allons détailler 4 méthodes de concaténation de std::string et int, de la plus simple à la plus professionnelle. Vous apprendrez pourquoi str + num ne fonctionne pas, comment contourner cette limitation et quelle méthode choisir pour votre tâche. C'est parti !
Pourquoi str + int ne fonctionne-t-il pas ? Bref rappel sur les types
\n\nEn C++, std::string est une classe, tandis que int est un type numérique natif. L'opérateur + pour std::string est surchargé, mais il attend un second opérande de type chaîne (std::string, const char* ou un caractère). Lorsque vous écrivez "Hello" + 42, le compilateur tente d'interpréter 42 comme un décalage arithmétique pour le pointeur vers le littéral de chaîne, et non comme un nombre à insérer.
Le résultat ? Un comportement indéfini, un plantage du programme ou des données parasites en mémoire. C'est pourquoi nous avons besoin de méthodes de conversion spéciales.
\n\nMéthode 1 : std::to_string — la plus simple (C++11 et versions ultérieures)
\n\nDepuis C++11, la bibliothèque standard inclut l'excellente fonction std::to_string. Elle convertit n'importe quel nombre (int, float, double, long, etc.) en std::string. Ensuite, il suffit de concaténer les deux chaînes.
#include <iostream>\n#include <string>\n\nint main() {\n std::string text = "Le nombre Pi est approximativement égal à ";\n int pi_int = 3;\n\n // Convertir int en chaîne et concaténer\n std::string result = text + std::to_string(pi_int);\n std::cout << result << std::endl; // Affiche : Le nombre Pi est approximativement égal à 3\n\n // On peut le faire en une seule ligne\n std::cout << "Réponse : " + std::to_string(42) << std::endl;\n\n return 0;\n}\n\nAvantages : lisible, concis, pas besoin d'inclure de bibliothèques supplémentaires (hormis <string>).
\nInconvénients : pas de contrôle du formatage (nombre de décimales, zéros non significatifs).
Méthode 2 : std::ostringstream — le roi du formatage
\n\nSi vous avez besoin non seulement de concaténer, mais aussi de formater le nombre (ajouter des zéros non significatifs, limiter la partie décimale), utilisez std::ostringstream du fichier d'en-tête <sstream>. Cette approche imite le fonctionnement de cout, mais stocke le résultat dans une chaîne.
#include <iostream>\n#include <sstream>\n#include <string>\n#include <iomanip> // pour std::setw et std::setfill\n\nint main() {\n int user_id = 7;\n std::ostringstream oss;\n\n // Formatage : ID avec zéros non significatifs sur 3 chiffres\n oss << "Utilisateur #" << std::setw(3) << std::setfill('0') << user_id;\n std::string formatted = oss.str();\n\n std::cout << formatted << std::endl; // Affiche : Utilisateur #007\n\n // Exemple plus complexe : nombre décimal\n double price = 19.5;\n std::ostringstream oss2;\n oss2 << "Prix : " << std::fixed << std::setprecision(2) << price << " €.";\n std::cout << oss2.str() << std::endl; // Affiche : Prix : 19.50 €.\n\n return 0;\n}\n\nAvantages : contrôle total du formatage, fonctionne avec tous les types.
\nInconvénients : code plus verbeux, nécessite d'inclure <sstream> et <iomanip>.
Méthode 3 : sprintf / snprintf — héritage du C (attention !)
\n\nSi vous travaillez avec du code ancien ou si, pour une raison quelconque, vous ne pouvez pas utiliser