[Solucionado] Problema con lista enlazada en C (buffer de entrada)

Iniciado por xassiz~, 20 Febrero 2011, 17:02 PM

0 Miembros y 1 Visitante están viendo este tema.

xassiz~

Lo solucioné así:
char mostrar_menu()
{
     char opcion[2];
     printf("\n\n\n MENU\n");
     printf("======\n");
     printf("1. Agregar contacto\n");
     printf("2. Buscar contacto por telefono\n");
     printf("3. Salir\n");
     fgets(opcion,3,stdin);
     return opcion[0];
}


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!

Littlehorse

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:

void CleanStdin()
{
while(getchar() != '\n');
}


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:



if(fgets(Buff, sizeof Buff, stdin))
sscanf(Buff, "%d", &Opt);






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:

Citarfflush(stdin) site:foro.elhacker.net

o

Citarfgets problema site:foro.elhacker.net

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

xassiz~

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

Código (c,75,76) [Seleccionar]

#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");
    printf("------------------");
    printf("\nNombre: ");
    fgets(nuevo->nombre,32,stdin);
    printf("\nTelefono: ");
    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("----------------------------");
    printf("\nTelefono: ");
    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;
    }
    printf("No encontrado.");
}


void mostrar_menu()
{
    printf("\n\n\n MENU\n");
    printf("======\n");
    printf("1. Agregar contacto\n");
    printf("2. Buscar contacto por telefono\n");
    printf("3. Salir\n");
}

int main()
{
   int opcion = 0;
   char bufferOpcion[5];
   while(opcion!=3){
       mostrar_menu();
       fgets(bufferOpcion,sizeof(bufferOpcion),stdin);
       sscanf(bufferOpcion, "%d", &opcion);
       switch(opcion){
           case 1:
               agregar_contacto();
               break;
           case 2:
               buscar_contacto_tlfn();
               break;
           default:
               break;
       }
   }
   return 0;
}


Saludos!