Introdução: por que cortar strings é uma dor para todo desenvolvedor C++
\n\nSe você já escreveu um analisador de logs, leu entrada do usuário ou processou arquivos CSV em C++, certamente já enfrentou o problema: as strings vêm com espaços "extras", tabulações ou quebras de linha. Em Python, existe o strip() embutido, em Java — trim(), e em C++ a biblioteca padrão não fornece uma função pronta para cortar strings. Esta é uma das perguntas mais populares no Stack Overflow (mais de 350.000 visualizações), e hoje vamos entender de uma vez por todas como resolver esse problema de forma elegante.
Neste artigo, você aprenderá:
\n- \n
- Por que o C++ não tem um
trimembutido e como contornar isso \n - 5 maneiras comprovadas de cortar
std::string\n - Como escrever sua própria função trim universal \n
- Quando usar Boost e quando usar C++ puro C++11/17 \n
O que é trim e para que serve?
\n\nTrim (corte de string) — é a remoção de caracteres de espaço em branco (espaço, tabulação, quebra de linha, retorno de carro) do início, fim ou de ambos os lados da string. Em C++, internamente, isso se resume a encontrar o primeiro e o último caractere não espaço em branco e criar uma substring entre eles.
\n\nCenários típicos onde o corte de strings em C++ é crítico:
\n- \n
- Validação de formulários — o usuário acidentalmente colocou um espaço antes do email \n
- Análise de arquivos de configuração — strings como
"chave = valor "\n - Trabalho com protocolos de rede — caracteres extras quebram os cabeçalhos \n
- Análise de logs — espaços atrapalham a busca e comparação \n
Método 1: Trim manual clássico (C++98/03)
\n\nO método mais antigo e compreensível — usar find_first_not_of e find_last_not_of. Esses métodos procuram o primeiro/último caractere que NÃO está no conjunto especificado (por padrão — espaços).
#include <string>\n#include <cctype>\n\nstd::string trim(const std::string& str) {\n const std::string whitespace = " \\t\\n\\r\\f\\v";\n size_t start = str.find_first_not_of(whitespace);\n if (start == std::string::npos)\n return ""; // string consiste apenas de espaços\n size_t end = str.find_last_not_of(whitespace);\n return str.substr(start, end - start + 1);\n}\n\nPrós: funciona em qualquer padrão C++, sem dependências. Contras: cria uma nova string (cópia). Para a maioria das tarefas, isso não é um problema, mas se você estiver cortando milhões de strings — pense no desempenho.
\n\nMétodo 2: Modificação no local (in-place trim, C++11)
\n\nSe você quiser alterar a string original sem cópia, use erase e iteradores. Este método é especialmente útil ao trabalhar com buffers grandes.
#include <string>\n#include <algorithm>\n\nstd::string& trim_in_place(std::string& str) {\n const std::string whitespace = " \\t\\n\\r\\f\\v";\n // Remove do início\n str.erase(0, str.find_first_not_of(whitespace));\n // Remove do fim\n size_t end = str.find_last_not_of(whitespace);\n if (end != std::string::npos)\n str.erase(end + 1);\n return str;\n}\n\nObserve: após erase do início, a string é deslocada, o que pode ser caro para strings muito longas. Mas para casos típicos (até 10K caracteres) — funciona muito bem.
Método 3: Usando <algorithm> e lambdas (C++17)
\n\nO C++ moderno permite escrever código mais declarativo. Usamos std::find_if_not para encontrar o primeiro caractere não espaço em branco.
#include <string>\n#include <algorithm>\n#include <cctype>\n\nstd::string trim_modern(const std::string& str) {\n auto is_space = [](unsigned char ch) { return std::isspace(ch); };\n \n auto start = std::find_if_not(str.begin(), str.end(), is_sp