2009-01-26 23 views
16

¿Soy yo o no hay funciones de recorte estándar en la biblioteca c o C++? ¿hay alguna función única que actúe como un ajuste? Si no, ¿alguien puede decirme por qué recortar no es parte de la biblioteca estándar? (Sé ajuste está en alza)trim no es parte de la biblioteca c/C++ estándar?

Mi código de ajuste es

std::string trim(const std::string &str) 
{ 
    size_t s = str.find_first_not_of(" \n\r\t"); 
    size_t e = str.find_last_not_of (" \n\r\t"); 

    if((string::npos == s) || (string::npos == e)) 
     return ""; 
    else 
     return str.substr(s, e-s+1); 
} 

prueba: cout < < ajuste (" n \ r \ r \ n \ r \ n texto \ aquí \ ncon retorno \ n \ r \ r \ n \ r \ n "); -edit- en su mayoría quería saber por qué no estaba en la biblioteca estándar, la respuesta de BobbyShaftoe es genial. trim is not part of the standard c/c++ library?

Respuesta

16

La razón por la que trim() no está en la biblioteca estándar es que cuando se creó el último estándar, tuvieron que encontrar un equilibrio entre formalizar el comportamiento actual (no agregar nada nuevo, simplemente estabilizar lo que ya existía) y agregar nuevo funcionalidad. En general, prefirieron no agregar una función a menos que 1) sea imposible de lo contrario, o 2) que haya inconvenientes significativos para usar bibliotecas de terceros. Hacer demasiados cambios serían

  • compatibilidad ruptura con el código existente (que pueden haber definido su propio ajuste()
  • Añadir más trabajo para los autores de compiladores (que ya tenía una enorme cantidad de trabajo por delante de ellos)
  • que el lenguaje sea más difícil de aprender y utilizar.

con trim(), no hay grandes problemas de interoperabilidad. mientras su tercero TRIM() aplicación toma una cadena y devuelve una cadena, que Don realmente me importa dónde está definido. Por lo tanto, no es realmente necesario En la biblioteca estándar. Puede ser facilmente facilitado por otras bibliotecas.

Por el contrario, algo así como la clase de cadena o vector, son clases que debe proporcionar la biblioteca estándar, porque si utiliza una clase de cadena personalizada, solo funcionarán las operaciones de cadena de esa biblioteca. Con una cadena de biblioteca estándar, las bibliotecas de terceros pueden orientar esta definición de cadena común, y todos ganan.

Cuando la última norma salió, Herb Sutter escribió un post que describe muy bien here

Por supuesto, sería bueno tener una función trim(), pero tenían más importantes que hacer. Primero tenían que estandarizar todos los elementos básicos. No creo que C++ 0x agregue una función de recorte, pero agregará una gran cantidad de otras utilidades de conveniencia que en el '98 se consideraron "innecesarias" o demasiado especializadas.

29

No, tiene que escribirlo usted mismo o utilizar alguna otra biblioteca como Boost y demás.

En C++, se puede hacer:

#include <string> 

const std::string whiteSpaces(" \f\n\r\t\v"); 


void trimRight(std::string& str, 
     const std::string& trimChars = whiteSpaces) 
{ 
    std::string::size_type pos = str.find_last_not_of(trimChars); 
    str.erase(pos + 1);  
} 


void trimLeft(std::string& str, 
     const std::string& trimChars = whiteSpaces) 
{ 
    std::string::size_type pos = str.find_first_not_of(trimChars); 
    str.erase(0, pos); 
} 


void trim(std::string& str, const std::string& trimChars = whiteSpaces) 
{ 
    trimRight(str, trimChars); 
    trimLeft(str, trimChars); 
} 
+1

Esta es la mejor de las implementaciones más cortas que he visto, y ni siquiera necesitó hacer ningún truco para hacerlo. ¡Buen trabajo! – leetNightshade

1

No sé demasiado acerca de C++, pero check this out para ver cómo lograr esto en C. (En mi defensa: usted hizo decir C/C++ en el título :-)

1

en los viejos tiempos, con scanf(), un espacio concordaría con cualquier número de caracteres de espacio en blanco.

Esta es la razón por utilizamos fgets() seguido por sscanf(). Para evitar que coincida con una nueva línea como parte de ese espacio en blanco.

+0

Hay funciones para manipular * streams *, not * strings *. Existen equivalentes, como 'stream >> std :: ws', que consume todos los espacios en blanco posteriores. –

3

Como han dicho otros, el comité estaba ocupado con (muchos) otros problemas. Boost ha llenado algunos de los vacíos, al igual que con la biblioteca de trimming functions string_algo:

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n "); 
trim(testTrim); 
cout << testTrim; 
-1

Puede usar VC++. La clase CString tiene una función de recorte. : D

1

Creo que la razón principal es que ' ' es una definición bastante estrecha de espacios en blanco; por ejemplo, también me gustaría eliminar L' ' y L' ' mediante una función trim(); sin embargo, solo la biblioteca locale tiene esa información.

El mismo razonamiento se aplica a los que suelen especificar to_upper y métodos to_lower - hay algunas personas (especialmente en Turquía) que están en desacuerdo con la típica c &= ~0x20; mapeo utilizado normalmente para ASCII.

Cuestiones relacionadas