Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Darioxhcx en 26 Julio 2010, 20:01 pm



Título: quitar espacios en cadena ?
Publicado por: Darioxhcx en 26 Julio 2010, 20:01 pm
tengo una duda :P
como puedo quitar el caracter ' ' de una cadena , suponiendo que la cadena la tome con gets(cadena);

digamos que a "hola como estas"
deberia quedarme como "holacomoestas"

alguna sugerencia :/ ?
yo no entiendo como hacerlo :/
gracias
saludos

pd: ahh en C , no en c++ ;P



Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 20:04 pm
En C++ hay una funcion o manipulador que lo hace  :xD En C, bueno dicen que los caminos son infinitos, pero lo mas seguro es que necesites memoria dinamica y cadenas auxiliares...

Saludos


Título: Re: quitar espacios en cadena ?
Publicado por: Darioxhcx en 26 Julio 2010, 20:06 pm
:xD

o aunque sea como detectar un espacio , seria mas facil creeria
" " = \0 ? ni hay no ' el \0 es nulo , pero no espacio no ?
toy flasheando cualquiera me parece XDDD


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 20:11 pm
Pes...
Código
  1. if (cadena[i]==' ') savetheposition;

Guardas la posicion para que sepas hasta adonde te interesa la cadena... O tambien quizas puedas usar strtok()... Pon el code  :xD

Saludos...


Título: Re: quitar espacios en cadena ?
Publicado por: leogtz en 26 Julio 2010, 20:13 pm
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5.    char *cadena = "Hola mundo!";
  6.    if(strchr(cadena, ' '))
  7.    puts("Si");
  8.    else
  9.    puts("No");
  10.    return 0;
  11. }
  12.  

Código
  1. #include <stdio.h>
  2. void squeeze(char s[], char c)
  3. {
  4. unsigned int i, j;
  5. for(i = j = 0; s[i] != '\0'; i++)
  6. if(s[i] != c)
  7. s[j++] = s[i];
  8. s[j] = '\0';
  9. }
  10. int main(void)
  11. {
  12.    char cadena[] = "Hola mundo";
  13.    squeeze(cadena, ' ');
  14.    puts(cadena);
  15.    return 0;
  16. }
  17.  

Es strchr() no strchar().


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 20:15 pm
Pero strchar() es para decir si hay o no hay dicho caracter, mas no cuantos... si no me equivoco, yo de c no c  :xD

Saludos...


Título: Re: quitar espacios en cadena ?
Publicado por: Darioxhcx en 26 Julio 2010, 20:16 pm
gracias ;­D
strchar seguramente esta en string.h no '
weno ire a averiguar a seguir leyendo ;P
gracias ^^


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 20:24 pm
Es como dice Leo strchr()...

Y esa solucion que te dieron ta muy wena  :xD

Saludos...


Título: Re: quitar espacios en cadena ?
Publicado por: cbug en 26 Julio 2010, 21:01 pm
Esta es mi solución, pero sin modificar la cadena original, sino colocándola en una nueva.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. int main()
  7. {
  8. char s[] = "HOLA COMO ESTAS ?                 BIEN Y TU";
  9.  
  10. char *tmp, *aux;
  11.  
  12. aux = malloc(strlen(s));
  13. tmp = malloc(strlen(s));
  14.  
  15. tmp = strtok(s, " ");
  16.  
  17. while(tmp != NULL)
  18. {
  19. strcat(aux, tmp);
  20. tmp = strtok(NULL, " ");
  21. }
  22.  
  23. free(tmp);
  24. puts(aux);
  25. free(aux);
  26.  
  27. return 0;
  28. }


Título: Re: quitar espacios en cadena ?
Publicado por: leogtz en 26 Julio 2010, 21:05 pm
@cbug, no necesitas reservar espacio para "tmp".


Título: Re: quitar espacios en cadena ?
Publicado por: cbug en 26 Julio 2010, 21:06 pm
 :o eso es lo que no pude entender... a qué se debe?


Título: Re: quitar espacios en cadena ?
Publicado por: [L]ord [R]NA en 26 Julio 2010, 21:10 pm
:o eso es lo que no pude entender... a qué se debe?

debido a que strtok devuelve un puntero a un char.


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 21:11 pm
Pes porque es un puntero jeje le das la direccion de la cadena pero "cortada" Y en ese malloc() creo que falta el casting... ademas estas dandole espacio de mas a aux... lo mejor seria contar los espacios y restarcelos a strlen(s)....

Saludos...

PD: Mas o menos eso es lo que yo habia pensado...


Título: Re: quitar espacios en cadena ?
Publicado por: do-while en 26 Julio 2010, 22:07 pm
¡Buenas!

Aqui va otra, no se si mas rapida o no, pero puede que con alguna linea menos de codigo:

Código
  1. char* squeeze(char *s,char c)
  2. {
  3.    char *resto;
  4.  
  5.    while((resto = strchr(s,c)))
  6.        strcpy(resto,resto+1); /* siempre se puede hacer: strlen(s+1) = strlen(s) - 1 */
  7.  
  8.    return s;
  9. }
  10.  

¡Saludos!


Título: Re: quitar espacios en cadena ?
Publicado por: Darioxhcx en 26 Julio 2010, 22:17 pm
asdaasd para para paraa que todavía no lei sobre punteros y lo que lei no lo entendi xDDD :xD
bueno , igual tengo tarea pa la noche ;P


Título: Re: quitar espacios en cadena ?
Publicado por: do-while en 26 Julio 2010, 22:23 pm
Ok ok. Que nos emocionamos y no sabiamos cuanto sabias...   :xD

En ese caso la solucion que mejor te viene es la de Leo Gutiérrez.

¡Saludos!


Título: Re: quitar espacios en cadena ?
Publicado por: cbug en 26 Julio 2010, 23:09 pm
Exacto...

OFF TOPIC : Do-While estaría bueno que propongas un problema en C cada cierto período y se pueda resolver entre todos, para así poder analizar distintas soluciones según el nivel que tenga cada uno y así contribuir aún más.

Este problema es sencillo, pero a la vez bastante útil ciertas veces.


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 23:22 pm
Si quieres ver ejercicios dificiles mira los de "las olimpiedas informaticas españolas" eso si es feo  :xD

Saludos...


Título: Re: quitar espacios en cadena ?
Publicado por: cbug en 26 Julio 2010, 23:26 pm
Difíciles o no, estaría bueno resolver entre todos. :D


Título: Re: quitar espacios en cadena ?
Publicado por: .:BlackCoder:. en 26 Julio 2010, 23:27 pm
Weno metete en la pagina saca uno y nos ponemos a hacerlo horita ando pariendo con archivos  :xD...


Título: Re: quitar espacios en cadena ?
Publicado por: do-while en 26 Julio 2010, 23:31 pm
Si quieres ver ejercicios dificiles mira los de "las olimpiedas informaticas españolas" eso si es feo  :xD

Jur jur jur... ejercicios feos feisimos. Mas feos que los Borbones... Trabajando en C++ aun se tiene ventaja, por la STL, que es estandar y puedes utilizarla, pero en C, el echo de tener que estar construyendo las estructuras de datos para cada problema en el que hacen falta es una autentica locura. Otra fuente de demencia son los problemas en los que la salida no quedan bien definida y tienes que resolver el problema ajustando la salida por ensayo y error...

http://www.olimpiada-informatica.org/?cmd=inici

¡Saludos!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: quitar espacios en cadena ?
Publicado por: cbug en 26 Julio 2010, 23:33 pm
Pero propón uno o dos a lo sumo, sino luego se hace tedioso y mucho desorden resolver todos  :P


Título: Re: quitar espacios en cadena ?
Publicado por: do-while en 26 Julio 2010, 23:44 pm
A ver, yo no tengo imaginacion para los ejercicios, y de todas formas tampoco me parece correcto empezar un hilo sobre ello, siendo que en el apartado de Programacion general hay un subforo de Ejercicios, si quieres puedes ir cogiendo problemas de ese subforo.

Siento no hacer lo que planteas, pero lo que pides ya existe. Otra cosa es que escojas el problema que quieras o mas te interese, y lo plantees para que lo comentemos.

Ademas, todo esto ya queda offtopic.  :xD

¡Saludos!


Título: Re: quitar espacios en cadena ?
Publicado por: MIG80 en 26 Julio 2010, 23:45 pm
Exacto...

OFF TOPIC : Do-While estaría bueno que propongas un problema en C cada cierto período y se pueda resolver entre todos, para así poder analizar distintas soluciones según el nivel que tenga cada uno y así contribuir aún más.

Este problema es sencillo, pero a la vez bastante útil ciertas veces.

¡Excelente idea! yo me apunto  :laugh:


Título: Re: quitar espacios en cadena ?
Publicado por: leogtz en 26 Julio 2010, 23:47 pm
Si quieres ver ejercicios dificiles mira los de "las olimpiedas informaticas españolas" eso si es feo  :xD

Jur jur jur... ejercicios feos feisimos. Mas feos que los Borbones... Trabajando en C++ aun se tiene ventaja, por la STL, que es estandar y puedes utilizarla, pero en C, el echo de tener que estar construyendo las estructuras de datos para cada problema en el que hacen falta es una autentica locura. Otra fuente de demencia son los problemas en los que la salida no quedan bien definida y tienes que resolver el problema ajustando la salida por ensayo y error...

http://www.olimpiada-informatica.org/?cmd=inici

¡Saludos!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Me imagino qué tedio sería participar en C. Yo preferiría concursar en C++.  :D


Título: Re: quitar espacios en cadena ?
Publicado por: Littlehorse en 27 Julio 2010, 01:26 am
Yo no tendría problema con un hilo en el cual se planteen ejercicios para evaluar distintas formas de resolver problemas. El asunto es que si se hacen ejercicios de complejidad baja a media, a la larga quedara una guía de tareas incluso con múltiples opciones para los mas vagos.

También esta el drama que hay que estar controlando a cada rato que ningún usuario nuevo plantee un ejercicio en ese hilo, porque si no seria muy fácil que un usuario se registre, plantee un ejercicio, y como resultado obtenga la tarea para el y para todo su curso.

Por esas dos cosas, lo ideal seria que hagan algo así en el subforo de ejercicios (http://foro.elhacker.net/ejercicios-b38.0/), que de hecho ya existen hilos similares y no solo de C/C++, si no de varios lenguajes.

De paso cierro ya que la duda principal esta resuelta y el hilo entro en offtopic hace rato.

Saludos!