Título: Problema con LISTAS y un switch. Publicado por: flowrd23 en 4 Julio 2019, 20:49 pm Estoy empezando a entender listas, tengo el siguiente problema: El menú de opciones vuelve a repetirse indefinidamente luego de devolver "inicio", en vez de volver a solicitar una opción al usuario ¿Qué anda mal?
Código:
Título: Re: Problema con LISTAS y un switch. Publicado por: K-YreX en 5 Julio 2019, 01:25 am El programa parece que funciona correctamente...
Si tu problema es que no se vuelve a mostrar lo de "Ingrese una opcion\n" es porque se encuentra fuera del <do while>. Si no te refieres a eso, manda la salida de tu programa y especifica cuál es el problema ya que yo al menos no lo encuentro :-X Título: Re: Problema con LISTAS y un switch. Publicado por: flowrd23 en 5 Julio 2019, 03:08 am Muchas gracias por responder.
El problema es que vuelve a ingresar automáticamente a la opción 1 luego de ingresar el primer el primer dato a la lista. Una captura: https://ibb.co/jyyWwX3 Título: Re: Problema con LISTAS y un switch. Publicado por: RayR en 5 Julio 2019, 21:35 pm No lo ejecuté, pero tienes varios errores. Primero, la recomendación es que uses fgets en lugar de gets, pues esta última es una función insegura. Pasando a los errores, uno es que estás leyendo year con gets, pero year es un int, por lo que gets está sobrescribiendo memoria incorrectamente y obviamente year queda con basura. Usa scanf.
Otro, el getchar que usas es para eliminar el caracter de nueva línea '\n' que algunas funciones dejan en el buffer de entrada, pero gets no es una de esas funciones, por lo que, en tu programa, los getchar lo unico que ocasionan es que el primer caracter de la siguiente línea introducida sea descartado, es decir, en el ejemplo de la captura que pusiste, lo que en realidad se estaría almacenando en grupo es "ammstein", ya que la "R" es leída y removida por el getchar que le precede. Debes borrar todos los getchar y sólo ponerlos después de los scanf, que sí dejan el '\n'. Y el que quizás sea el más importante, el parámetro de crearLista es de tipo incorrecto. Como sabrás, cuando quieres que una función sea capaz de modificar una variable (como un int, float, etc.) que le pases como argumento, hay que hacerlo por referencia, que en C significa pasar un puntero a dicha variable. Lo mismo pasa con los punteros: si quieres modificar un puntero (no sólo los valores a los que apunta, sino el propio puntero), debes pasarle un puntero a puntero. Porque tal como lo tienes, crearLista recibe una copia del puntero inicio, por lo que cuando haces esto: Código
lo que estás modificando es la copia de inicio que sólo existe dentro de crearLista. Al regresar a main, inicio (la variable local de main) seguirá apuntando a NULL. Cambia el prototipo y la definición de la función a: Código
y dentro de esa función, donde ponías inicio, pon *inicio. Y la invocas así: Código
Te reitero que no lo probé, por lo que no sé si haya más errores, pero esto debería corregir al menos el problema que tienes actualmente. Título: Re: Problema con LISTAS y un switch. Publicado por: flowrd23 en 4 Agosto 2019, 01:49 am Gracias....
Cómo uso el fgets? Traté de usar para una sola entrada para el miembro nombre (ignorando y borrando los demás miembros de la estructura nodo) : fgets(nuevo->nombre, 31, stdin); y NO FUNCIONA.... Código
Título: Re: Problema con LISTAS y un switch. Publicado por: flowrd23 en 4 Agosto 2019, 01:53 am Respecto al código anterior, es funcional con scanf si las entradas de palabras no tienen espacio. Cómo incorporo correctamente fgets? probé cambiando todos los scanf que reciben caracteres con fgets pero así lo pasa por alto y vuelve al menú...
Necesito resolver esto, para avanzar más. Título: Re: Problema con LISTAS y un switch. Publicado por: K-YreX en 4 Agosto 2019, 02:10 am No creo que tenga ninguna complicación. En internet habrá infinidad de ejemplos al igual que en otros temas de este foro...
Código PD: Ten cuidado ya que <fgets()> guarda también el salto de línea de cuando das al ENTER. Y el problema que tendrás será porque tienes cosas en el buffer (saltos de línea seguramente) y no lo limpias. Es cierto que todo el mundo usa la función <fflush(stdin)> de forma incorrecta ya que <fflush()> está diseñada para trabajar con <stdout> pero obviamente no hace lo mismo. Tienes otras alternativas para limpiar el buffer que se comentaron en un tema de este foro de C/C++. Título: Re: Problema con LISTAS y un switch. Publicado por: flowrd23 en 5 Agosto 2019, 00:05 am Ya intenté probando limpiadores de buffers...fflush, .....getchar, etc. NO CONSIGO solución, ahora me saltea los scanf que levantan año y ubicación.
Código
Título: Re: Problema con LISTAS y un switch. Publicado por: K-YreX en 5 Agosto 2019, 01:44 am Tienes que saber cuándo tienes algo en el buffer y cuando no. Si no tienes nada y pones un <getchar()> el programa espera un ENTER, entonces tienes que darlo antes de que te salga el siguiente mensaje y puedas introducir el siguiente dato. En tu caso sobran <getchar()> ya que <fgets()> guarda el ENTER dentro del nombre y no son necesarios pero si tienes problemas será que estás sobrepasando el límite de tamaño que tienes establecido.
Si cambiando el tamaño no consigues solucionarlo coloca un ejemplo de ejecución para poder verlo con más detalle. |