| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
t4r0x
Registrado: 14 Jun 2014 Mensajes: 1
| Publicado: 14/06/2014 9:31 pm | | | Título: Como remover espacios en C/C++? |
| Buenas quiero saber si alguien puede decirme como puedo remover espacios en C/C++ pero preservando los espacios que pueden haber entre patron dado por ejemplo:
tengo esta cadena:
"A BCD EF '12 3 45' GHI'67 890' JK '1' L"
y quiero obtener: "ABCDEF'12 3 45'GHI'67 890'JK'1'L"
como pueden ver remueve todos los espacios excluyendo los espacios que haya entre ese patron, en este caso serian los apostrofos ( ' ). normalmente lo hago con remove y erase pero me remueve incluyendo los que hayan entre los apostrofos. |
| | Volver arriba | |  | dehm
Registrado: 29 Abr 2011 Mensajes: 139
| Publicado: 17/06/2014 1:11 am | | | Título: |
| Hola: Pongo una forma un tanto chapucera por mezclar char y string, aunque lo del string lo hago por comodidad, para no tener que calcular el tamaño del char que se le pasa a la función y simplificar la forma de obtener la cadena resultante, y así centrar el problema en la cuestión de eliminar caracteres de espacio o no según se encuentre un caracter que sirva de indicador.
La idea es simple. Tengo una variable booleana que si está a true (por ejemplo) sólo me pasa a la cadena resultante los caracteres diferentes del espacio, pero si cambia su estado, inserta en la cadena resultante todos los caracteres. Cuando se encuentra con el centinela, cambia el estado.
Y una aproximación a la implementación (mejorable) 
| Código: | #include <iostream> #include <string.h> using namespace std; string tratar(char* cad);
int main() { char cadena[]="A BCD EF '12 3 45' GHI'67 890' JK '1' L";
string resultado=tratar(cadena); cout<<resultado<<endl;
return 0; }
string tratar(char* cad) { string cadena_resultante="";//aqui pasaré la cadena resultante bool quitar_espacios=true; int i=0; while (*(cad+i)!='\0') { if (quitar_espacios) { if (*(cad+i)!=' ') //solo paso a la cadena resultante los caracteres que no sean espacio { cadena_resultante+=*(cad+i); //forma facilona de incorporar los caracteres al string. if (*(cad+i)==39) //el caracter apóstrofe,no sabía como ponerlo entre comillas { quitar_espacios=!quitar_espacios; } } } else //si quitar_espacios == false incorporo todos los caracteres, sin quitar los espacios { cadena_resultante+=*(cad+i); if (*(cad+i)==39) { quitar_espacios=!quitar_espacios; } } i++; } return cadena_resultante; }
|
Saludos! _________________ Aprendiendo |
| | Volver arriba | |  | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 22/06/2014 7:59 am | | | Título: |
| Con una variable de control que cambie con cada comilla simple, se puede resolver:
| Código: | #include <stdio.h> #include <string.h>
int main(int argc, char ** argv) { const char * cadena = "A BCD EF '12 3 45' GHI'67 890' JK '1' L"; char result[50]; int quoted = 0, i = 0;
// Recorro cadena while(*cadena) { if (*cadena == '\'') { quoted = !quoted; // Invierto estado result[i++] = *cadena; } else { // En función del estado, salto los espacios if (quoted) result[i++] = *cadena; else { if (*cadena != ' ') result[i++] = *cadena; } } ++cadena; }
printf("Resultado: %s\n", result);
return 0; }
|
Cuidado: este código pierde el puntero cadena porque lo usa para avanzar sobre la memoria. Se puede salvar copiando en un puntero extra. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |