Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda en pequeño ejercicio

Estas en el tema de Duda en pequeño ejercicio en el foro de C/C++ en Foros del Web. Tengo un ejercicio que le paso una cadena y me la edita a capicua, un ejemplo: Le paso la palabra jamón, pues me saldria jamonnomaj. ...
  #1 (permalink)  
Antiguo 04/04/2016, 17:17
 
Fecha de Ingreso: febrero-2015
Mensajes: 61
Antigüedad: 9 años, 9 meses
Puntos: 0
Duda en pequeño ejercicio

Tengo un ejercicio que le paso una cadena y me la edita a capicua, un ejemplo:

Le paso la palabra jamón, pues me saldria jamonnomaj.



Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void main(){
  5.     char cadena[20];
  6.     int i, x, cont=0, pepe=0;
  7.  
  8.     printf("Introduce una palabra: ");
  9.     gets(cadena);
  10.  
  11.     for(i=0;pepe!=5;i++){
  12.         cont=i;
  13.         if(cadena[i]==NULL){
  14.             for(x=cont;x!=0;x--,i++){
  15.                 cadena[i]=cadena[x-1];
  16.                 pepe=5;
  17.             }
  18.         }
  19.     }
  20.  
  21.     printf("CADENA %s", cadena);
  22.  
  23.  
  24.  
  25.     fflush(stdin);
  26.     getchar();
  27.  
  28.  
  29.  
  30. }



No sabia como salir del primer for, he puesto eso de pepe. Esta bien?

Porque si que me sale, pero el resultado del programa no es jamonnomja, es jamonnomja con signos raros. Me hace el capicua bien, pero las celdas restantes del char me salen rellenadas con signos.

Que esta mal?


Un saludo.
  #2 (permalink)  
Antiguo 04/04/2016, 21:13
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Respuesta: Duda en pequeño ejercicio

Que relajo.

Incluso es difícil seguir el código. Antes de poder llegar a la solucion de tu duda hay que limpiar el código:

Primero, realmente no necesitas la variable cont. Ya tienes i:

Código C++:
Ver original
  1. for (i = 0; pepe != 5; i++)
  2.     {
  3.         if (cadena[i] == NULL)
  4.         {
  5.             for (x = i; x != 0; x--, i++)
  6.             {
  7.                 cadena[i] = cadena[x - 1];
  8.                 pepe = 5;
  9.             }
  10.         }
  11.     }

Si te das cuenta, no necesitas 2 fors anidados. Puedes sacar el interior y todo se simplifica. Ya no necesitas a pepe:



Código C++:
Ver original
  1. printf("Introduce una palabra: ");
  2.     gets(cadena);
  3.  
  4.     for (i = 0; ; i++)
  5.     {
  6.         if (cadena[i] == NULL)
  7.         {
  8.             break;
  9.         }
  10.     }
  11.  
  12.     for (x = i; x != 0; x--, i++)
  13.     {
  14.         cadena[i] = cadena[x - 1];
  15.     }
  16.  
  17.     printf("CADENA %s", cadena);

Ya se ve mucho mas simple no?

Aun se puede simplificar mas. Podemos unir el if con el for:

Código C++:
Ver original
  1. for (i = 0; cadena[i] != 0; i++)
  2.     {
  3.     }

Y como veo que ya incluyes string.h, entonces puedes puedes sustituir por:

Código C++:
Ver original
  1. i=strlen(cadena);

Ahora, en el segundo for: Tienes un pequeño detalle:

Código C++:
Ver original
  1. for (x = i; x != 0; x--, i++)
  2.     {
  3.         cadena[i] = cadena[x - 1];
  4.     }
La posición 0 también se debe incluir por lo que mejor usa:

Código C++:
Ver original
  1. for (x = i; x >=0; x--, i++)
  2.     {
  3.         cadena[i] = cadena[x - 1];
  4.     }

Finalmente, para que no te salga basura, debes inicializar tu arreglo char con todos sus elementos a 0. Porque printf va a leer el arreglo hasta encontrar un 0. Entonces si no lo encuentra, se sigue y te imprime otras cosas.

Aun no es un código limpio y legible, pero esta mucho mejor que como estaba. No crees?.

El punto es que no necesitabas fors anidados.

Saludos
  #3 (permalink)  
Antiguo 05/04/2016, 04:00
 
Fecha de Ingreso: febrero-2015
Mensajes: 61
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Duda en pequeño ejercicio

Gracias por la respuesta!!


He inicializado el char tal que asi

Código C:
Ver original
  1. char cadena[20] = "";

y me sigue saliendo basura, pero ahora solo me sale un signo, antes me salian hasta que se acababan los espacios del array (hasta que llegaba a 20 celdas) ahora solo me sale uno... que cosa mas rara , no?
  #4 (permalink)  
Antiguo 05/04/2016, 04:44
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Duda en pequeño ejercicio

Cita:
Iniciado por IVICP3 Ver Mensaje
He inicializado el char tal que asi

Código C:
Ver original
  1. char cadena[20] = "";

y me sigue saliendo basura, pero ahora solo me sale un signo, antes me salian hasta que se acababan los espacios del array (hasta que llegaba a 20 celdas) ahora solo me sale uno... que cosa mas rara , no?
Con eso no has inicializado el arreglo con todos los elementos a 0... únicamente has indicado que el primer elemento sea 0 mientras que el resto seguirán con la basura habitual.

Una forma de inicializar la memoria a 0 bastante limpia es usar, por ejemplo, memset:

Código C++:
Ver original
  1. memset(cadena,0,sizeof(cadena));

Otra opción para evitar errores es finalizar manualmente la cadena, añadiendo un '\0' después de finalizar la copia. Quizás algo tal que:

Código C++:
Ver original
  1. cadena[i*2]='\0';

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 05/04/2016, 10:11
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Duda en pequeño ejercicio

Además gets guarda el salto de línea así que en vez de comparar con 0 tendría que comparar con \n.
Sobre lo de setear una cadena, hace unos días vi por casualidad que en string.h existe strset que si no entendí mal servía para eso pero yo la probé y al final acabé usando memset porque no me funcionó. ¿strset no es para eso?
  #6 (permalink)  
Antiguo 05/04/2016, 11:20
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Duda en pequeño ejercicio

strset no te sirve. La razón es que esa función sustituye el contenido de la cadena por un carácter concreto hasta que se encuentra con un nulo. Esto es así porque esa función no conoce el tamaño del buffer.

Usar esa función en un string no inicializado o bien corrompe memoria al no encontrar un nulo antes de salirse del buffer, o bien no setea todo el buffer por encontrar un nulo antes de llegar al final.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: cadena, char, ejercicio, int, pequeño, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:39.