A mi entender, es una de las funciones más útiles que se han inventado, como programador de PHP estoy harto de utilizarlo para filtrar información (caracteres a la derecha y a la izquierda, ya sean espacios, caracteres especiales o algún carácter que yo utilice para el control de la información).
Sabemos que el usuario final no nos va a dejar las cosas fáciles, puesto que a veces, nos llena un campo con «intros» al principio y al final; o la información, después de pasar por HTTP, lectura de un archivo XML o por otros tratamientos, tal vez tenga un retorno de carro al final; por eso, a veces es útil hacer:
1 |
Pero ahora estamos en C++, bien quería postear también el código en C++, así que decidí googlear un poco para ver esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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 ); } |
Con esto podemos jugar con nuestros textos…
Ahora vamos al caso de C, muchos se siguen preguntando… pero si C es un lenguaje muy antiguo, ¿aún se sigue usando? Pues sí ! Aunque muchas cosas sean horribles de programar en C, a pelo, se sigue usando, y aún le queda mucha vida a este lenguaje. Por eso, veremos dos funciones trim() especiales para C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <stdio.h> #include <string.h> char *trim(char *s) { char *start = s; /* Nos comemos los espacios al inicio */ while(*start && isspace(*start)) ++start; char *i = start; char *end = start; /* Nos comemos los espacios al final */ while(*i) { if( !isspace(*(i++)) ) end = i; } /* Escribimos el terminados */ *end = 0; return start; } char *trim2(char *s, const char *trimChars) { char *start = s; /* Nos comemos los caracteres al principio */ while(*start && strpbrk((const char*)start, trimChars)==start) ++start; char *i = start; char *end = start; /* Nos comemos los caracteres al final */ while(*i) { if( strpbrk(i++, trimChars)!=i-1 ) end = i; } /* Coloramos el perminador */ *end = 0; return start; } int main() { char mi_cadena[30]="\f\n Cadena; \tSucia \n\t ;"; printf("Mi cadena inicialmente: "%s"\n", mi_cadena); printf("Mi cadena tras trim(): "%s"\n", trim(mi_cadena)); printf("Mi cadena tras trim2(): "%s"\n", trim2(mi_cadena,";\f\n\t")); } |
En C también podremos tener nuestro trimleft y nuestro trimright y creo que es fácil sacarlo desde esta función general, ya que *start se mueve indicando el principio de la cadena, y con end, y es ese movimiento (que aunque perdemos algo de memoria) el que hace que se recorte la cadena; además, como buena función de C, perdemos la cadena que inicialmente teníamos.
Pingback: Bitacoras.com /
Pingback: Poesía binaria » Finalizó el Tuenti Contest, ¿qué os pareció? /
Pingback: Poesía binaria » #tuentiContest Solución al Challenge 15 . Reto del artista en C /
Gracias por la implementacion en C de la funcion trim() me sirvio mucho no soy un habido de C pero me sacas de apuros, felicidades por tu blog y date un vuelta por el mio, muuuuucho mas pobre que el tuyo pero confio en que le sirva a alguien
Saludos
Muchas gracias Manuel!
Te voy a poner un link desde esta web
Pingback: Magia en Bash 50 ejemplos en una sola linea (o dos) | Poesía Binaria /
Pingback: Creando un cliente para un servicio de red con pocas líneas en C++ – Poesía Binaria /