Uniendo cadena y número en C++: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.

\n\n

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á!

\n\n

¿Por qué no funciona str + int? Brevemente sobre tipos

\n\n

En 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.

\n\n

¿El resultado? Comportamiento indefinido, bloqueo del programa o basura en la memoria. Por eso necesitamos métodos de conversión especiales.

\n\n

Forma 1: std::to_string — la más simple (C++11 y posteriores)

\n\n

A 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.

\n\n
#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\n

Ventajas: legible, conciso, no requiere incluir bibliotecas adicionales (excepto <string>).
\nDesventajas: sin control de formato (cantidad de decimales, ceros a la izquierda).

\n\n

Forma 2: std::ostringstream — el rey del formato

\n\n

Si 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.

\n\n
#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\n

Ventajas: control total del formato, funciona con cualquier tipo.
\nDesventajas: código más verboso, requiere incluir <sstream> y <iomanip>.

\n\n

Forma 3: sprintf / snprintf — herencia de C (¡con cuidado!)

\n\n

Si trabajas con código antiguo o por alguna razón no puedes usar

Blogs

Book Recommendations