Como cortar std::string em C++: 5 maneiras práticas para iniciantes e profissionais

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que cortar strings é uma dor para todo desenvolvedor C++

\n\n

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

\n\n

Neste artigo, você aprenderá:

\n
    \n
  • Por que o C++ não tem um trim embutido 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
\n\n

O que é trim e para que serve?

\n\n

Trim (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\n

Cená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
\n\n

Método 1: Trim manual clássico (C++98/03)

\n\n

O 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).

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

Pró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\n

Método 2: Modificação no local (in-place trim, C++11)

\n\n

Se você quiser alterar a string original sem cópia, use erase e iteradores. Este método é especialmente útil ao trabalhar com buffers grandes.

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

Observe: 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.

\n\n

Método 3: Usando <algorithm> e lambdas (C++17)

\n\n

O C++ moderno permite escrever código mais declarativo. Usamos std::find_if_not para encontrar o primeiro caractere não espaço em branco.

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

Blogs

Book Recommendations