Introducción: por qué recortar cadenas es un dolor para todo desarrollador de C++
\n\nSi alguna vez has escrito un analizador de registros, leído entrada de usuario o procesado archivos CSV en C++, seguramente te has encontrado con el problema: las cadenas llegan con espacios "sobrantes", tabulaciones o saltos de línea. En Python existe el método incorporado strip(), en Java — trim(), mientras que en C++ la biblioteca estándar no proporciona una función lista para recortar cadenas. Esta es una de las preguntas más populares en Stack Overflow (más de 350 000 visitas), y hoy de una vez por todas entenderemos cómo resolver elegantemente esta tarea.
En este artículo aprenderás:
\n- \n
- Por qué C++ no tiene un
trimincorporado y cómo solucionarlo \n - 5 formas probadas de recortar
std::string\n - Cómo escribir tu propia función trim universal \n
- Cuándo usar Boost y cuándo usar C++ puro C++11/17 \n
¿Qué es trim y para qué sirve?
\n\nTrim (recorte de cadena) — es la eliminación de caracteres de espacio en blanco (espacio, tabulación, salto de línea, retorno de carro) al inicio, al final o en ambos lados de la cadena. En C++ internamente esto se reduce a buscar el primer y último carácter que no sea espacio en blanco y crear una subcadena entre ellos.
\n\nEscenarios típicos donde el recorte de cadenas en C++ es crítico:
\n- \n
- Validación de formularios — el usuario accidentalmente puso un espacio antes del email \n
- Análisis de archivos de configuración — cadenas como
"clave = valor "\n - Trabajo con protocolos de red — caracteres sobrantes rompen los encabezados \n
- Análisis de registros — los espacios dificultan la búsqueda y comparación \n
Forma 1: Trim manual clásico (C++98/03)
\n\nEl método más antiguo y comprensible — usar find_first_not_of y find_last_not_of. Estos métodos buscan el primer/último carácter que NO está en el conjunto dado (por defecto — espacios).
#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 ""; // la cadena consiste solo de espacios\n size_t end = str.find_last_not_of(whitespace);\n return str.substr(start, end - start + 1);\n}\n\nVentajas: funciona en cualquier estándar de C++, sin dependencias. Desventajas: crea una nueva cadena (copia). Para la mayoría de las tareas esto no es un problema, pero si recortas millones de cadenas — piensa en el rendimiento.
\n\nForma 2: Modificación en el lugar (in-place trim, C++11)
\n\nSi quieres modificar la cadena original sin copiarla, usa erase e iteradores. Este método es especialmente útil al trabajar con grandes búferes.
#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 // Eliminar del inicio\n str.erase(0, str.find_first_not_of(whitespace));\n // Eliminar del final\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\nNota: después de erase desde el inicio, la cadena se desplaza, lo que puede ser costoso para cadenas muy largas. Pero para casos típicos (hasta 10K caracteres) — funciona muy bien.
Forma 3: Uso de <algorithm> y lambdas (C++17)
\n\nC++ moderno permite escribir código más declarativo. Usamos std::find_if_not para buscar el primer carácter que no sea espacio.
#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