Cómo recortar std::string en C++: 5 formas prácticas para principiantes y expertos

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

Introducción: por qué recortar cadenas es un dolor para todo desarrollador de C++

\n\n

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

\n\n

En este artículo aprenderás:

\n
    \n
  • Por qué C++ no tiene un trim incorporado 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
\n\n

¿Qué es trim y para qué sirve?

\n\n

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

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

Forma 1: Trim manual clásico (C++98/03)

\n\n

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

\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 ""; // 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\n

Ventajas: 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\n

Forma 2: Modificación en el lugar (in-place trim, C++11)

\n\n

Si quieres modificar la cadena original sin copiarla, usa erase e iteradores. Este método es especialmente útil al trabajar con grandes búferes.

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

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

\n\n

Forma 3: Uso de <algorithm> y lambdas (C++17)

\n\n

C++ moderno permite escribir código más declarativo. Usamos std::find_if_not para buscar el primer carácter que no sea espacio.

\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