• Martes 16 de Abril de 2024, 17:23

Autor Tema:  C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA  (Leído 78173 veces)

Erbil

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« en: Miércoles 6 de Agosto de 2008, 21:38 »
0
Hola, soy nuevo en el foro y en la programación con C y C++

Llevo dos días buscando un código en C que elimine los espacios en blanco de una cadena, hay respuestas que dicen que es muy fácil y otros que muy difícil. El caso es que al final nadie cuelga el código. Yo me inclino más en que no saben.
Me pregunto:  ¿Alguien sabe cómo es el dichoso código en C que elimine los espacios en blanco?
Estoy ya harto  :hitcomp:  y no doy con la solución. Si alguien puede ayudarme se lo agradecería.

Gracias. :good:

fORU-

  • Miembro MUY activo
  • ***
  • Mensajes: 225
  • Nacionalidad: mo
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #1 en: Miércoles 6 de Agosto de 2008, 22:31 »
0
En realidad no es complicado solo tienes que pensar un poco.

1.- tener tamano de la cadena < strleng(cadena) >
2.- ciclo <for , while, .... conta=0 ; conta <=tamanoCadena; conta++ >
3.-condicion dentro del ciclo <si es espacion en blanco has esto sino has otra cosa o simplemente sigue>
4.- fin

vez no es complicado lo unico que ocpuas investigar es que numero en hex es el expacio en blanco para poderlo comparar

P>D> NO SE HACEN ,TRABAJOS , SI BUSCAS CODIGO PODRAS ENCONTRARLO EN ALGUNA PAG.
« última modificación: Miércoles 6 de Agosto de 2008, 22:34 por fORU- »
atte:fORU-

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #2 en: Miércoles 6 de Agosto de 2008, 22:34 »
0
http://www.todoexpertos.com/categorias/tecnologia-e-internet/programacion/c-y-c------/respuestas/1395074/quitar-espacios-a-una-cadena

te escribo un codigo, que realmente no se si compilara bien, porke estoy desde una pc que no tiene ningun compilador C, y no puedo bajar ninguno, estoy en mi universidad.
pero pegale una ojeada.

aclaro para los boludos que no faltan en cuestionar cualkier tipo de errores, que este codigo lo escribo para que supuestamente ande o funcione especificamente con la cadena que doy yo.

NO ES GENERICO, NO ES UN ALGORITMO GENERAL, NO ES UN MODULO, ES CODIGO BRUTO

AH!!!! y no es OPTIMO!!!!!!!!!!!!! esta escrito de una pasada y a lo bruto .... muy bruto por cierto.


Código: Text
  1.  
  2. char *cadena = "HOLA MUNDO";
  3. char *cadena2[11];
  4. void main() {
  5.    char caracter;
  6.    int i,j = 0;
  7.    for (i = 0;caracter != '';i++) {
  8.        caracter = cadena[i];
  9.        if (caracter != ' ') {            // tambien puedes preguntar si caracter == 32
  10.           cadena2[j] = caracter;
  11.           j++;
  12.        }
  13.    }
  14. }
  15.  
  16.  

de todas maneras, hay una funcion , que dandole como argumento una variable caracter  o   byte, te devuelve si es o no un caracter imprimible. entonces, en el IF , usarias esa funcion .

espero te alla ayudado un pokito aunque sea.

a la funcion , te la dejo para que vos la busques, hace eso.

vuelvo a aclarar, es codigo BRUTOOOOO, no lo critiquen!!!!!!!!!!!!!!
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

fORU-

  • Miembro MUY activo
  • ***
  • Mensajes: 225
  • Nacionalidad: mo
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #3 en: Miércoles 6 de Agosto de 2008, 22:36 »
0
PARA:fachamix  :beer:

Companero aqui no hacemos tareas solo damos pistas  :no:  con las pistas que damos dejamos que se quiebren la cabeza un rato  :brickwall:
atte:fORU-

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #4 en: Miércoles 6 de Agosto de 2008, 23:05 »
0
ok hermano, tienes razon, es la filosofia que tendria que haber tenido.

no pasa la prox. a no ser que sea absolutamente necesario :D


saludos


(igual no creo que compile el codigo jajajajajaja)
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Erbil

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #5 en: Jueves 7 de Agosto de 2008, 13:35 »
0
Bueno comprendeo la filosofía y está bien, dicho esto, mi itención no es lucrarme ni beneficiarme económicamente, es simplemente que este problema no consigo sacarlo, para implementarlo a un código de un ejercicio. Y como pasa con esto
hay ejercicios que son muy difíciles que se enciende la bombilla al instánte y otras veces ejercicios como este, al parecer fáciles, no se me enciende. Y buscando tutoriales información no consigo el código.

Pero bien seguiré currandomelo, a ver si lo consigo.

Gracias de todas formas. :good:

Erbil

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #6 en: Jueves 7 de Agosto de 2008, 13:55 »
0
¡¡¡Dios mío!!! pero que gilipollez tan grande!!
 
¡Creo que debo pedir disculpas por preguntar semejante tontería! :argh:  :wacko:  :brickwall:

Gracias amigos, a veces la mente se bloquea de tal manera, ¡con lo fácil que era!.

Bueno intentaré recompensar aportando a este foro lo que en mis buenas manos estén.

Gracias ¡compis! :beer:

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #7 en: Lunes 11 de Mayo de 2009, 15:01 »
0
en 3 lineas:

Código: C
  1. char*tmp;
  2. while((tmp=strchr(cadena,32))!=NULL)
  3.   sprintf(tmp,"%s",tmp+1);
  4.  

32 es el codigo de el caracter de espaciado

ademas asi no necesitas el string.h

EDITO: si se necesita string.h, se me fue la olla sorry xD
« última modificación: Viernes 15 de Mayo de 2009, 14:48 por haevan »

Luciano9

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #8 en: Lunes 11 de Mayo de 2009, 17:40 »
0
Cita de: "haevan"
en 3 lineas:

char*tmp;
while((tmp=strchr(cadena,32))!=NULL)
             sprintf(tmp,"%s",tmp+1);

32 es el codigo de el caracter de espaciado

ademas asi no necesitas el string.h
:good: los programadores terminamos vagos D:
jajaj

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #9 en: Lunes 11 de Mayo de 2009, 17:42 »
0
Cita de: "haevan"
en 3 lineas:

char*tmp;
while((tmp=strchr(cadena,32))!=NULL)
             sprintf(tmp,"%s",tmp+1);

32 es el codigo de el caracter de espaciado

ademas asi no necesitas el string.h
¿?¿?¿?¿?¿?¿?¿?¿¿?

si la necesita a string.h , donde crees que esta strchr() ???????

y dudo de la funcionalidad del codigo que has escrito, si alguien lo puede probar, buenisimo, ya que aqui no tengo ningun compilador para probar.

saludos amigo
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #10 en: Jueves 14 de Mayo de 2009, 03:35 »
0
Cita de: "fachamix"
¿?¿?¿?¿?¿?¿?¿?¿¿?

si la necesita a string.h , donde crees que esta strchr() ???????

y dudo de la funcionalidad del codigo que has escrito, si alguien lo puede probar, buenisimo, ya que aqui no tengo ningun compilador para probar.

saludos amigo

perdon, he tenido un despiste

yo lo he probado en linux (compilo con gcc) y funciona, que alguien lo pruebe en windows y asi salimos de dudas

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #11 en: Jueves 14 de Mayo de 2009, 15:33 »
0
el codigono funciona en windows.

compila perfectamente pero no funciona.

use codeblocks con MingW.

aqui tu codigo:

Código: C++
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     cout << "probando quita espacios" << endl;
  9.     char*tmp;
  10.     while((tmp=strchr("HOLA PROBANDO ESTO - CHE",32))!=NULL)
  11.     sprintf(tmp,"%s",tmp+1);
  12.  
  13.     return 0;
  14. }
  15.  
  16.  

probe poniendo y sacando string.h , no funciona, salta error en el sistema.
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #12 en: Jueves 14 de Mayo de 2009, 15:57 »
0
Cita de: "fachamix"
salta error en el sistema
Violación de memoria, seguramente (la próxima vez es de agradecer que pongas qué error es). Es lógico porque no has reservado memoria. char *tmp está muy bien, pero no te reserva la memoria para la futura cadena.

Tienes 2 opciones: o usas malloc() o defines un vector de tamaño fijo, rollo char tmp[256].

EDITO: estoy equivocado, strchr() sólo devuelve un puntero dentro de la misma cadena o NULL.

Saludos
« última modificación: Jueves 14 de Mayo de 2009, 16:34 por m0skit0 »

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #13 en: Jueves 14 de Mayo de 2009, 16:30 »
0
En realidad el quiere trabajar siempre sobre el mismo buffer,a fin de cuentas el tamaño de la cadena sera siempre igual o menor ... el problema es que la cadena esa ira a parar a la seccion de datos de solo lectura. Asi, poniendo la cadena en la pila, funciona:

Código: Text
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     cout << "probando quita espacios" << endl;
  8.     char*tmp;
  9.     char h[] = "HOLA PROBANDO ESTO - CHE";
  10.     while((tmp=strchr(h,32))!=NULL)
  11.     sprintf(tmp,"%s",tmp+1);
  12.     cout << h;
  13.     return 0;
  14. }
  15.  

PD. El != NULL sobra  ;)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #14 en: Jueves 14 de Mayo de 2009, 18:22 »
0
lo probe ahora, y si funciona asi.

pero no entiendo , como hace para sacar los espacios.

se para que sirve strchr.

cuando sprintf, no se porque hace tmp+1

tampoco se, en que momento SACO LOS ESPACIOS A h

una mano señores, de explicacion gaucha de instrccion por instruccion, como un cuento jajajaja.
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #15 en: Jueves 14 de Mayo de 2009, 18:44 »
0
tmp siempre que no es NULL es un puntero a un espacio (' ') dentro de la cadena original (h en este caso) entonces sprintf le da formato.

sprintf(tmp,"%s",tmp+1);

Por ejemplo:
tmp = " PROBANDO ESTO - CHE";
tmp + 1 = "PROBANDO ESTO - CHE";

entonces tmp pierde el espacio del principio mediante una copia.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #16 en: Jueves 14 de Mayo de 2009, 19:44 »
0
Cita de: "Eternal Idol"
tmp siempre que no es NULL es un puntero a un espacio (' ') dentro de la cadena original (h en este caso) entonces sprintf le da formato.

sprintf(tmp,"%s",tmp+1);

Por ejemplo:
tmp = " PROBANDO ESTO - CHE";
tmp + 1 = "PROBANDO ESTO - CHE";

entonces tmp pierde el espacio del principio mediante una copia.

perfecto hasta aqui, pero suponiendo que la cadena sea "HOLA FORO SOLOCODIGO", sin espacio al principio:

tmp = "HOLA FORO SOLOCODIGO";
tmp + 1 = "FORO SOLOCODIGO";

supuestamente como lo entiendo, perderia la primera palabra ,.... aunque ya vi queno es asi, que si funciona bien, pero no se porque NO PIERDO LA PRIMER PALABRA  :argh:   :brickwall:
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #17 en: Jueves 14 de Mayo de 2009, 20:04 »
0
"HOLA" esta atras del espacio con el que comienza tmp, strchr retorno ese puntero justamente.

Si h es 0x1010 entonces la primera vez que llamas a strchr retorna 0x1015.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

fachamix

  • Miembro MUY activo
  • ***
  • Mensajes: 173
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #18 en: Jueves 14 de Mayo de 2009, 20:19 »
0
y en que parte del codigo voy almacenando la cadena sin espacios en h ???
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #19 en: Jueves 14 de Mayo de 2009, 20:41 »
0
tmp es un puntero dentro de la cadena original (h), cuando haces el sprintf la esta modificando de la manera que ya se menciono ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #20 en: Viernes 15 de Mayo de 2009, 14:37 »
0
Cita de: "m0skit0"
Es lógico porque no has reservado memoria. char *tmp está muy bien, pero no te reserva la memoria para la futura cadena.

Tienes 2 opciones: o usas malloc() o defines un vector de tamaño fijo, rollo char tmp[256].

no lo pillo, no vuelco los datos a tmp, solo le hago apuntar a una direccion de memoria que me devuelve strchr, no entiendo que tenga que reservar memoria

Yonimiler

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #21 en: Viernes 24 de Septiembre de 2010, 16:37 »
0
No se desgasten miren que facil:

string cadena = "Frase con espacios en blanco";

cadena = cadena.Replace ( " ", "" );

czealt

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #22 en: Sábado 25 de Septiembre de 2010, 05:47 »
0
La solucion de Yonimiler esta muy bien si se utiliza C++  :D

Otra solución usando strcpy en lugar de sprintf:

Código: Text
  1.  
  2.   char h[]="Hola foro solo codigo";
  3.   char *tmp;
  4.   while((tmp=strchr(h,' '))!=NULL)
  5.     strcpy(tmp,tmp+1);
  6.   printf("%sn",h);
  7.  
  8.  
Saludos!

Edit: Ja ja ja no me di cuenta que era un hilo un tanto viejo  :wacko:

DarknessZ3R0

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re:C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
« Respuesta #23 en: Miércoles 12 de Octubre de 2016, 01:36 »
0
Buenas yo logre hacer esto hace poco quizas ayude a gente que ocupe ayuda con el código :jumpie:
void quitaEspacio(char c[])
{
     int i=0,j;
     while(c){
            if(c==' ' && c[i+1]==' ')
                    for(j=i+1;c[j];j++)
                        c[j]=c[j+1];
            else
                i++;
     }


}