Como juntar std::string e int em C++: armadilhas não óbvias
\n\nVocê já escreveu algo como "Hello" + 42 em C++ e obteve, em vez do esperado "Hello42", um conjunto estranho de caracteres? Se sim — você não está sozinho. Esta pergunta no Stack Overflow acumulou dezenas de milhares de visualizações, e não é à toa. Em C++, a concatenação de uma string e um número não é uma tarefa tão trivial quanto em Python ou JavaScript. Aqui, você precisa conhecer alguns truques.
Neste artigo, vamos abordar 4 maneiras de concatenar std::string e int, da mais simples à mais profissional. Você aprenderá por que str + num não funciona, como contornar essa limitação e qual método escolher para sua tarefa. Vamos lá!
Por que str + int não funciona? Breve explicação sobre tipos
\n\nEm C++, std::string é uma classe, e int é um tipo numérico nativo. O operador + para std::string está sobrecarregado, mas ele espera que o segundo operando também seja do tipo string (std::string, const char* ou um caractere). Quando você escreve "Hello" + 42, o compilador tenta interpretar 42 como um deslocamento aritmético para o ponteiro do literal de string, e não como um número para inserção.
O resultado? Comportamento indefinido, travamento do programa ou lixo na memória. É por isso que precisamos de métodos especiais de conversão.
\n\nMétodo 1: std::to_string — o mais simples (C++11 e posteriores)
\n\nA partir do C++11, a biblioteca padrão inclui a excelente função std::to_string. Ela converte qualquer número (int, float, double, long, etc.) em std::string. Depois disso, é uma simples concatenação de duas strings.
#include <iostream>\n#include <string>\n\nint main() {\n std::string text = "O número Pi é aproximadamente ";\n int pi_int = 3;\n\n // Converte int para string e concatena\n std::string result = text + std::to_string(pi_int);\n std::cout << result << std::endl; // Saída: O número Pi é aproximadamente 3\n\n // Pode ser feito em uma única linha\n std::cout << "Resposta: " + std::to_string(42) << std::endl;\n\n return 0;\n}\n\nVantagens: legível, conciso, não requer bibliotecas adicionais (além de <string>).
\nDesvantagens: sem controle de formatação (número de casas decimais, zeros à esquerda).
Método 2: std::ostringstream — o rei da formatação
\n\nSe você precisa não apenas concatenar, mas também formatar o número (adicionar zeros à esquerda, limitar a parte fracionária), use std::ostringstream do arquivo de cabeçalho <sstream>. Esta abordagem imita o funcionamento do cout, mas salva o resultado em uma string.
#include <iostream>\n#include <sstream>\n#include <string>\n#include <iomanip> // para std::setw e std::setfill\n\nint main() {\n int user_id = 7;\n std::ostringstream oss;\n\n // Formata: ID com zeros à esquerda até 3 dígitos\n oss << "Usuário #" << std::setw(3) << std::setfill('0') << user_id;\n std::string formatted = oss.str();\n\n std::cout << formatted << std::endl; // Saída: Usuário #007\n\n // Exemplo mais complexo: número decimal\n double price = 19.5;\n std::ostringstream oss2;\n oss2 << "Preço: " << std::fixed << std::setprecision(2) << price << " reais.";\n std::cout << oss2.str() << std::endl; // Saída: Preço: 19.50 reais.\n\n return 0;\n}\n\nVantagens: controle total de formatação, funciona com qualquer tipo.
\nDesvantagens: código mais verboso, requer inclusão de <sstream> e <iomanip>.
Método 3: sprintf / snprintf — herança do C (cuidado!)
\n\nSe você trabalha com código antigo ou por algum motivo não pode usar