SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Erbil en Miércoles 6 de Agosto de 2008, 21:38

Título: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Erbil en Miércoles 6 de Agosto de 2008, 21:38
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:
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fORU- en Miércoles 6 de Agosto de 2008, 22:31
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.
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Miércoles 6 de Agosto de 2008, 22:34
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!!!!!!!!!!!!!!
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fORU- en Miércoles 6 de Agosto de 2008, 22:36
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:
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Miércoles 6 de Agosto de 2008, 23:05
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)
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Erbil en Jueves 7 de Agosto de 2008, 13:35
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:
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Erbil en Jueves 7 de Agosto de 2008, 13:55
¡¡¡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:
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: haevan en Lunes 11 de Mayo de 2009, 15:01
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Luciano9 en Lunes 11 de Mayo de 2009, 17:40
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Lunes 11 de Mayo de 2009, 17:42
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: haevan en Jueves 14 de Mayo de 2009, 03:35
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Jueves 14 de Mayo de 2009, 15:33
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.
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: m0skit0 en Jueves 14 de Mayo de 2009, 15:57
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 16:30
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  ;)
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Jueves 14 de Mayo de 2009, 18:22
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.
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 18:44
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.
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Jueves 14 de Mayo de 2009, 19:44
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:
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 20:04
"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.
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: fachamix en Jueves 14 de Mayo de 2009, 20:19
y en que parte del codigo voy almacenando la cadena sin espacios en h ???
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Eternal Idol en Jueves 14 de Mayo de 2009, 20:41
tmp es un puntero dentro de la cadena original (h), cuando haces el sprintf la esta modificando de la manera que ya se menciono ...
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: haevan en Viernes 15 de Mayo de 2009, 14:37
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
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: Yonimiler en Viernes 24 de Septiembre de 2010, 16:37
No se desgasten miren que facil:

string cadena = "Frase con espacios en blanco";

cadena = cadena.Replace ( " ", "" );
Título: Re: C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: czealt en Sábado 25 de Septiembre de 2010, 05:47
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:
Título: Re:C : ELIMINAR ESPACIOS EN BLANCO DE UNA CADENA
Publicado por: DarknessZ3R0 en Miércoles 12 de Octubre de 2016, 01:36
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++;
     }


}