elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Problema con lista enlazada en C (buffer de entrada)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Problema con lista enlazada en C (buffer de entrada)  (Leído 10,082 veces)
xassiz~


Desconectado Desconectado

Mensajes: 457



Ver Perfil WWW
Re: Problema con lista enlazada en C
« Respuesta #10 en: 21 Febrero 2011, 20:45 pm »

Lo solucioné así:
Código
  1. char mostrar_menu()
  2. {
  3.     char opcion[2];
  4.     printf("\n\n\n MENU\n");
  5.     printf("======\n");
  6.     printf("1. Agregar contacto\n");
  7.     printf("2. Buscar contacto por telefono\n");
  8.     printf("3. Salir\n");
  9.     fgets(opcion,3,stdin);
  10.     return opcion[0];
  11. }

Pero me falla cuando elijo la opción "Salir" (3). No entiendo porqué funciona en las primeras y en esta no :-X

Dices que lo que hago no es del todo correcto... ¿tú como lo solucionarías?

Saludos!


En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Problema con lista enlazada en C
« Respuesta #11 en: 21 Febrero 2011, 22:01 pm »

Ahora tienes una cadena de 2 posiciones y a fgets le pasas 3 como tamaño por lo tanto lee 2 caracteres, por ende es posible que la cadena te quede sin el carácter nulo.

Si el problema es solo el contenido restante en el buffer de entrada, en Windows se puede tirar de la API para solucionarlo fácilmente, pero para no salir del estándar puedes hacer algo como esto:

Código
  1. void CleanStdin()
  2. {
  3. while(getchar() != '\n');
  4. }
  5.  

Aunque no debería hacer falta puesto que el salto de linea debería quedar perfectamente en la cadena pasada a fgets siempre que le dejes espacio. Luego puedes reemplazarlo fácilmente por un carácter nulo.

Con el tema de las lecturas, hay miles de formas de leer una opción. Usualmente cuando son opciones simples con fgets + sscanf basta y sobra:


Código
  1. if(fgets(Buff, sizeof Buff, stdin))
  2. sscanf(Buff, "%d", &Opt);
  3.  




El problema del buffer de entrada en Windows esta muy tratado en el foro. Hoy ya vi 3 posts con la misma duda asi que mi recomendación es que utilicen el buscador del foro, ya que hay hilos enteros solo sobre este tema. Tambien con Google pueden buscar algo como:

Citar
fflush(stdin) site:foro.elhacker.net

o

Citar
fgets problema site:foro.elhacker.net

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~


Desconectado Desconectado

Mensajes: 457



Ver Perfil WWW
Re: Problema con lista enlazada en C
« Respuesta #12 en: 21 Febrero 2011, 22:22 pm »

Bueno, gracias por todo, si al final era más simple de lo que parecía :rolleyes:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. struct _contacto {
  6.    char nombre[33];
  7.    char telefono[13];
  8.    struct _contacto *siguiente;
  9. };
  10. struct _contacto *primero, *ultimo;
  11.  
  12. void agregar_contacto()
  13. {
  14.     struct _contacto *nuevo;
  15.     nuevo = (struct _contacto*)malloc(sizeof(struct _contacto));
  16.     if(nuevo==NULL){
  17.         printf("\nNo hay espacio suficiente.");
  18.         return;
  19.     }
  20.     printf("\n\nAgregar contacto\n");
  21.     printf("------------------");
  22.     printf("\nNombre: ");
  23.     fgets(nuevo->nombre,32,stdin);
  24.     printf("\nTelefono: ");
  25.     fgets(nuevo->telefono,12,stdin);
  26.     nuevo->siguiente = NULL;
  27.     if(primero==NULL){
  28.         primero = nuevo;
  29.         ultimo = nuevo;
  30.     } else {
  31.         ultimo->siguiente = nuevo;
  32.         ultimo = nuevo;
  33.     }
  34. }
  35.  
  36. void buscar_contacto_tlfn()
  37. {
  38.     struct _contacto *busqueda, *actual;
  39.     busqueda = (struct _contacto*)malloc(sizeof(struct _contacto));
  40.     if(busqueda==NULL){
  41.         printf("\nNo hay espacio suficiente.");
  42.         return ;
  43.     }
  44.     printf("\n\nBuscar contacto por telefono\n");
  45.     printf("----------------------------");
  46.     printf("\nTelefono: ");
  47.     fgets(busqueda->telefono,12,stdin);
  48.     actual = primero;
  49.     while(actual!=NULL){
  50.         if(strcmp(actual->telefono,busqueda->telefono)==0){
  51.             printf("+Nombre: %s\n", actual->nombre);
  52.             return;
  53.         }
  54.         actual = actual->siguiente;
  55.     }
  56.     printf("No encontrado.");
  57. }
  58.  
  59.  
  60. void mostrar_menu()
  61. {
  62.     printf("\n\n\n MENU\n");
  63.     printf("======\n");
  64.     printf("1. Agregar contacto\n");
  65.     printf("2. Buscar contacto por telefono\n");
  66.     printf("3. Salir\n");
  67. }
  68.  
  69. int main()
  70. {
  71.    int opcion = 0;
  72.    char bufferOpcion[5];
  73.    while(opcion!=3){
  74.        mostrar_menu();
  75.        fgets(bufferOpcion,sizeof(bufferOpcion),stdin);
  76.        sscanf(bufferOpcion, "%d", &opcion);
  77.        switch(opcion){
  78.            case 1:
  79.                agregar_contacto();
  80.                break;
  81.            case 2:
  82.                buscar_contacto_tlfn();
  83.                break;
  84.            default:
  85.                break;
  86.        }
  87.    }
  88.    return 0;
  89. }
  90.  

Saludos!
« Última modificación: 21 Febrero 2011, 22:26 pm por pablomi » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines