Cómo unir std::string e int en C++: obstáculos no evidentes
\n\n¿Alguna vez has escrito algo como "Hola" + 42 en C++ y has obtenido, en lugar del esperado "Hola42", un extraño conjunto de caracteres? Si es así, no estás solo. Esta pregunta en Stack Overflow ha acumulado decenas de miles de visitas, y no sin razón. En C++, la concatenación de una cadena y un número no es una tarea tan trivial como en Python o JavaScript. Aquí necesitas conocer algunos trucos.
En este artículo, analizaremos 4 formas de concatenar std::string e int, desde la más simple hasta la más profesional. Aprenderás por qué str + num no funciona, cómo sortear esta limitación y qué método elegir para tu tarea. ¡Vamos allá!
¿Por qué no funciona str + int? Brevemente sobre tipos
\n\nEn C++, std::string es una clase, mientras que int es un tipo numérico incorporado. El operador + para std::string está sobrecargado, pero espera que el segundo operando también sea de tipo cadena (std::string, const char* o un carácter). Cuando escribes "Hola" + 42, el compilador intenta interpretar 42 como un desplazamiento aritmético para el puntero al literal de cadena, no como un número para insertar.
¿El resultado? Comportamiento indefinido, bloqueo del programa o basura en la memoria. Por eso necesitamos métodos de conversión especiales.
\n\nForma 1: std::to_string — la más simple (C++11 y posteriores)
\n\nA partir de C++11, la biblioteca estándar incluye la práctica función std::to_string. Convierte cualquier número (int, float, double, long, etc.) en un std::string. Luego, es una simple concatenación de dos cadenas.
#include <iostream>\n#include <string>\n\nint main() {\n std::string texto = "El número Pi es aproximadamente ";\n int pi_int = 3;\n\n // Convertimos int a cadena y concatenamos\n std::string resultado = texto + std::to_string(pi_int);\n std::cout << resultado << std::endl; // Salida: El número Pi es aproximadamente 3\n\n // Se puede hacer en una sola línea\n std::cout << "Respuesta: " + std::to_string(42) << std::endl;\n\n return 0;\n}\n\nVentajas: legible, conciso, no requiere incluir bibliotecas adicionales (excepto <string>).
\nDesventajas: sin control de formato (cantidad de decimales, ceros a la izquierda).
Forma 2: std::ostringstream — el rey del formato
\n\nSi necesitas no solo concatenar, sino también formatear el número (agregar ceros a la izquierda, limitar la parte decimal), usa std::ostringstream del archivo de encabezado <sstream>. Este enfoque imita el funcionamiento de cout, pero guarda el resultado en una cadena.
#include <iostream>\n#include <sstream>\n#include <string>\n#include <iomanip> // para std::setw y std::setfill\n\nint main() {\n int usuario_id = 7;\n std::ostringstream oss;\n\n // Formateamos: ID con ceros a la izquierda hasta 3 dígitos\n oss << "Usuario #" << std::setw(3) << std::setfill('0') << usuario_id;\n std::string formateado = oss.str();\n\n std::cout << formateado << std::endl; // Salida: Usuario #007\n\n // Ejemplo más complejo: número decimal\n double precio = 19.5;\n std::ostringstream oss2;\n oss2 << "Precio: " << std::fixed << std::setprecision(2) << precio << " €.";\n std::cout << oss2.str() << std::endl; // Salida: Precio: 19.50 €.\n\n return 0;\n}\n\nVentajas: control total del formato, funciona con cualquier tipo.
\nDesventajas: código más verboso, requiere incluir <sstream> y <iomanip>.
Forma 3: sprintf / snprintf — herencia de C (¡con cuidado!)
\n\nSi trabajas con código antiguo o por alguna razón no puedes usar