Duda en punteros con cadenas

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
javi_606
Mensajes: 55
Registrado: 05/01/2008 4:21 pm

Duda en punteros con cadenas

#1 Mensaje por javi_606 » 05/08/2014 11:54 am

Tengo que hacer una función que quite los espacios de una cadena, con punteros y trabajando directamente en esa cadena que te da el usuario, sin utilizar cadenas de apoyo.

Tengo el siguiente código en la función:

Código: Seleccionar todo

void QuitaEspacios(char *s)
{
    while (*s != '\0')
    {
        if (*s == ' ')
        {
            *s = *(s+1);
        }

        printf("%c", *s);
        s++;
    }


}
El While lo hago para leer los carácteres mientras no llegue al fin de cadena...Si no es espacio, el puntero avanza (s++) y si es espacio, procuro introducir el contenido de la siguiente posición del puntero
*(s+1) ....

Pero el programa falla cuando llega la cadena a un espacio..

¿Que estoy haciendo mal? Ayuda por favoooor!

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#2 Mensaje por untio » 06/08/2014 7:09 am

Hola,

Perdona si mi respuesta no te sirve. He cambiado algo tu código y he obtenido esto:

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>

void QuitaEspacios(char *s)
{
	char *p = s;
	int x = 0;
    while (*s != '\0')
    {
        if(*s == ' ')
        {
        	p = s;
        	while(*s != 0)
        	{
        		*s = *(s + 1);
        		++s;
        	}
        	s = p + 1;
        }
        ++s;
    }
}

int main(int argc, char** argv) {
	char cadena[100];
	strcpy(cadena, "Hay que ver como esta el mundo");
	QuitaEspacios(cadena);
	puts(cadena);
}
Ya sé que no es gran cosa, pero todos estamos aprendiendo.

Perdona mis errores.

Saludos.

Avatar de Usuario
cheroky
Mensajes: 2571
Registrado: 22/09/2005 11:00 pm
Ubicación: Valladolid (España)

#3 Mensaje por cheroky » 06/08/2014 7:22 am

Hola.

Esta asignación:

Código: Seleccionar todo

*s = *(s+1);
no tiene motivo ya que solamente se asigna al espacio [n] el elemento [n+1]. Además el programa puede reventar por intentar modificar un literal de cadena.

La lógica más sencilla para el programa es: mientras el carácter no es espacio, imprimirlo.

Código: Seleccionar todo

void QuitaEspacios(const char* s)
{
    while (*s != '\0')
    {
        if (*s != ' ')
            putchar(*s);

        s++;
    }
}
∙∃0ƒ∙
Imagen

Avatar de Usuario
untio
Mensajes: 389
Registrado: 17/09/2008 9:35 am
Ubicación: Provincia de Almería
Contactar:

#4 Mensaje por untio » 06/08/2014 7:51 am

Hola de nuevo,

Perdóname mis errores, pero yo pensaba que de lo que se trataba era de modificar una cadena de entrada eliminando todos los espacios de modo que fuese usable por el resto del programa.

Siento mis posibles errores,

Saludos.

Avatar de Usuario
cheroky
Mensajes: 2571
Registrado: 22/09/2005 11:00 pm
Ubicación: Valladolid (España)

#5 Mensaje por cheroky » 06/08/2014 7:59 am

Hola untio

Al parecer publicamos casi al mismo tiempo la respuesta.

Puede que si, que tenga que modificar la cadena, deduje por el código que solo tenia que imprimirla.


∙∃0ƒ∙
Imagen

javi_606
Mensajes: 55
Registrado: 05/01/2008 4:21 pm

#6 Mensaje por javi_606 » 06/08/2014 8:12 am

Gracias a los dos, ahora probaré los nuevos códigos a ver si lo consigo. Y si, lo que se trata es de modificar la cadena y dejarla sin espacios para utilizarla en el resto del programa.

No obstante, cheroky, precisamente esa asignación es la que daba el error. No entiendo por qué no puedo modificar ese valor...¿Me lo explicas mejor, por favor?

EDITO: El código de untio funciona perfectamente. Él también hace una asignación del tipo:

Código: Seleccionar todo

*s = *(s + 1);
Y funciona todo bien...No sé el motivo de que mi asignación no se hiciera correctamente.

Muchas gracias a los dos, aunque aún me gustaria despejar esa duda que tengo de las asignaciones con punteros.

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#7 Mensaje por rir3760 » 06/08/2014 8:24 am

Indicas que tu programa falla en la asignación pero no describes el comportamiento en detalle, como ya te comento cheroky si pasas una literal a la función, por ejemplo:

Código: Seleccionar todo

QuitaEspacios("Cadena que no deberia modificarse");
Es posible que el programa termine con un error catastrófico, por ejemplo el típico en MS Windows "El programa ha realizado una accion no permitida y debe cerrarse ...".

Para estar seguros por favor publica el código fuente completo del programa.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

javi_606
Mensajes: 55
Registrado: 05/01/2008 4:21 pm

#8 Mensaje por javi_606 » 06/08/2014 8:29 am

rir3760 escribió:Indicas que tu programa falla en la asignación pero no describes el comportamiento en detalle, como ya te comento cheroky si pasas una literal a la función, por ejemplo:

Código: Seleccionar todo

QuitaEspacios("Cadena que no deberia modificarse");
Es posible que el programa termine con un error catastrófico, por ejemplo el típico en MS Windows "El programa ha realizado una accion no permitida y debe cerrarse ...".

Para estar seguros por favor publica el código fuente completo del programa.

Un saludo
Exacto, estaba pasando un literal....Pero desconocía que fuera diferente pasar un literal que una cadena de variable digamos.

¿Por qué ocurre eso con las literales? Desconocía eso por completo. :shock:

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#9 Mensaje por rir3760 » 06/08/2014 8:46 am

Porque el estándar (la especificación del lenguaje) indica que modificar una literal como "ejemplo" tiene un resultado "no definido" (UB), puede pasar cualquier cosa incluyendo la mentada falla con terminación inmediata.

Y como no hay garantía de cual sera el comportamiento lo mejor es evitar esas operaciones.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

javi_606
Mensajes: 55
Registrado: 05/01/2008 4:21 pm

#10 Mensaje por javi_606 » 06/08/2014 2:59 pm

Muchas gracias por la aclaración!!

Pero ahora continuo con la relación de ejercicios y tengo más dudas, creo que abriré otro post para pedir ayuda en otro tema...disculpen mi pesadez!!! pero me cuesta el lenguaje C!!! :oops:

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados