Autor
|
Tema: [Solucionado] Problema con lista enlazada en C (buffer de entrada) (Leído 10,073 veces)
|
xassiz~
|
#Solucion del postBueno, estaba practicando con listas enlazadas en C, pero no se porque no me va esto El caso es que no me deja ingresar bien los datos, ¿uso mal fgets()? #include<stdio.h> #include<stdlib.h> #include<string.h> struct _contacto { char nombre[33]; char telefono[13]; struct _contacto *siguiente; }; struct _contacto *primero, *ultimo; void agregar_contacto() { struct _contacto *nuevo; nuevo = (struct _contacto *)malloc(sizeof(struct _contacto )); if(nuevo==NULL){ printf("\nNo hay espacio suficiente."); return; } printf("\n\nAgregar contacto\n"); fgets(nuevo ->nombre ,32,stdin ); fgets(nuevo ->telefono ,12,stdin ); nuevo->siguiente = NULL; if(primero==NULL){ primero = nuevo; ultimo = nuevo; } else { ultimo->siguiente = nuevo; ultimo = nuevo; } } void buscar_contacto_tlfn() { struct _contacto *busqueda, *actual; busqueda = (struct _contacto *)malloc(sizeof(struct _contacto )); if(busqueda==NULL){ printf("\nNo hay espacio suficiente."); return ; } printf("\n\nBuscar contacto por telefono\n"); printf("----------------------------"); fgets(busqueda ->telefono ,12,stdin ); actual = primero; while(actual!=NULL){ if(strcmp(actual ->telefono ,busqueda ->telefono )==0){ printf("+Nombre: %s\n", actual ->nombre ); return; } actual = actual->siguiente; } } int opcion = 0; void mostrar_menu() { opcion = 0; printf("1. Agregar contacto\n"); printf("2. Buscar contacto por telefono\n"); } int main() { while(opcion!=3){ mostrar_menu(); switch(opcion) { case 1: agregar_contacto(); break; case 2: buscar_contacto_tlfn(); break; default: break; } } return 0; }
Saludos!
|
|
« Última modificación: 21 Febrero 2011, 22:26 pm por pablomi »
|
En línea
|
|
|
|
Shut
Desconectado
Mensajes: 7
|
Hola, bueno lo primero que tienes que incluir la libreria <stdlib.h> para usar la malloc. El problema que sugieres al intentar meter los nombres, es porque el fgets suele dar problemas.Es porque se queda en el buffer del teclado el intro y por eso te salta una opcion del menu.Deberias poner antes de cada fgets, fflush(stdin) para limpiar el buffer y que no te salte.
|
|
« Última modificación: 20 Febrero 2011, 19:54 pm por Shut »
|
En línea
|
|
|
|
xassiz~
|
s porque se queda en el buffer del teclado el intro y por eso te salta una opcion del menu.Deberias poner antes de cada gets, fflush(stdin) para limpiar el buffer y que no te salte.
Gracias, funciona, pero en este post fijado dicen que fflush(stdin); es mala costumbre y que lo del buffer debería darme problemas con scanf() pero no con fgets()
|
|
« Última modificación: 20 Febrero 2011, 20:02 pm por pablomi »
|
En línea
|
|
|
|
Shut
Desconectado
Mensajes: 7
|
Bueno pues entonces si no la quieres usar puedes probar lo del post, es una solucion mejor parece ser, es comprobar si se quedo almacenado un salto de linea en esa posicion, y si es asi mete un nulo. Puedes probar, y si funciona pues mejor. Sino siempre quedara fflush(stdin) xdd Voi a comprobar yo si me funciona con lo de poner el nulo
|
|
|
En línea
|
|
|
|
Leber
Desconectado
Mensajes: 338
"Fracta, non verba"
|
Puedes meter un '\0' directamente. Así es como yo lo hago. #include <stdio.h> #include <string.h>
int main(int argc, char **argv) {
char test[20];
fgets(test, sizeof(test)-1, stdin); test[strlen(test)-1] = '\0'; printf("%s\n", test); return 0; }
|
|
|
En línea
|
"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
|
|
|
xassiz~
|
Pero lo de cambiar el salto por línea por el caracter nulo sería en el momento de elegir la opción en el menú, ¿no? En ese caso tengo que reemplazar el scanf() por fgets() y poner la variable opcion como un arreglo de caracteres
|
|
|
En línea
|
|
|
|
D4RIO
Desconectado
Mensajes: 1.004
U N I X
|
Usa readline de GNU
|
|
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Las variables globales son perjudiciales para la salud, trata de evitarlas siempre que sea posible. En ese caso tengo que reemplazar el scanf() por fgets() y poner la variable opcion como un arreglo de caracteres Efectivamente. La forma mas segura de realizar un ingreso de datos por parte del usuario es leyendo como texto y luego parseando y validando lo necesario. Saludos
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
xassiz~
|
Bueno, ya me deshice de variables globales y de los scanf(), pero curiosamente sigue pasando el mismo error #include<stdio.h> #include<stdlib.h> #include<string.h> struct _contacto { char nombre[33]; char telefono[13]; struct _contacto *siguiente; }; struct _contacto *primero, *ultimo; void agregar_contacto() { struct _contacto *nuevo; nuevo = (struct _contacto *)malloc(sizeof(struct _contacto )); if(nuevo==NULL){ printf("\nNo hay espacio suficiente."); return; } printf("\n\nAgregar contacto\n"); fgets(nuevo ->nombre ,32,stdin ); fgets(nuevo ->telefono ,12,stdin ); nuevo->siguiente = NULL; if(primero==NULL){ primero = nuevo; ultimo = nuevo; } else { ultimo->siguiente = nuevo; ultimo = nuevo; } } void buscar_contacto_tlfn() { struct _contacto *busqueda, *actual; busqueda = (struct _contacto *)malloc(sizeof(struct _contacto )); if(busqueda==NULL){ printf("\nNo hay espacio suficiente."); return ; } printf("\n\nBuscar contacto por telefono\n"); printf("----------------------------"); fgets(busqueda ->telefono ,12,stdin ); actual = primero; while(actual!=NULL){ if(strcmp(actual ->telefono ,busqueda ->telefono )==0){ printf("+Nombre: %s\n", actual ->nombre ); return; } actual = actual->siguiente; } } char mostrar_menu() { char opcion[3]; printf("1. Agregar contacto\n"); printf("2. Buscar contacto por telefono\n"); return opcion[0]; } int main() { char opcion='0'; while(opcion!='3'){ opcion = mostrar_menu(); if(opcion=='1') agregar_contacto(); else if(opcion=='2') buscar_contacto_tlfn(); } return 0; }
Saludos!
|
|
« Última modificación: 21 Febrero 2011, 19:08 pm por pablomi »
|
En línea
|
|
|
|
Littlehorse
All the world's a stage
Moderador
Desconectado
Mensajes: 2.714
Nie Dam Sie
|
Es que de la forma que haces la lectura, fgets nunca llega a leer el salto de linea por lo tanto nada puede hacer con el. Si tenes una cadena de 3 posiciones, y a fgets le pasas como parámetro que lea solo 2, en realidad lee 2-1. Es decir, lee 1 solo carácter, luego agrega el carácter nulo a la cadena, y el salto de linea queda deambulando por el buffer de entrada. Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first. A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str. A null character is automatically appended in str after the characters read to signal the end of the C string. Cuando dije leer como texto me referia a leer y analizar una expresion para verificar si el usuario ha ingresado la opción correctamente. Lo que estas haciendo ahora es utilizar una cadena como si fuese un solo carácter y aunque es legal no es del todo correcto. Saludos!
|
|
|
En línea
|
An expert is a man who has made all the mistakes which can be made, in a very narrow field.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con lista enlazada
Programación C/C++
|
Lain0x
|
2
|
3,417
|
8 Julio 2011, 13:20 pm
por Valkyr
|
|
|
[Solucionado]Dual monitor Dvi-D24+1 pin a Vga problema analogico,entrada digital
Hardware
|
Anonymous250
|
9
|
26,065
|
27 Noviembre 2013, 05:18 am
por andresmadeddie
|
|
|
problema con funcion insertar de una lista enlazada
Programación C/C++
|
roger13
|
0
|
1,950
|
20 Octubre 2013, 01:44 am
por roger13
|
|
|
[Solucionado]Lista enlazada guardar y cargar datos
Programación C/C++
|
erickgracia
|
2
|
11,428
|
7 Mayo 2014, 18:34 pm
por erickgracia
|
|
|
¿Queda algo en el Buffer de Entrada stdin? (Solucionado)
« 1 2 »
Programación C/C++
|
AlbertoBSD
|
11
|
4,885
|
7 Diciembre 2018, 09:46 am
por MAFUS
|
|