Reemplazo de fflush (stdin)

2 minutos de lectura

avatar de usuario
Lijo

Tengo el siguiente código,

fflush(stdin);
print("Enter y/n");
scanf("%c",&a);

Aquí, se está cerrando antes de dar la entrada. Parece que el problema se debe a que no está vaciando el búfer de entrada que podría tener algunos caracteres no deseados. ¿Hay alguna alternativa para vaciar (stdin). Este fragmento de código funciona en Solaris pero no funciona en Linux.

  • primera línea de man fflush lee: La función fflush() fuerza un escribe de todos los datos almacenados en búfer en el espacio de usuario para el salida o actualización Arroyo. cnicutar tiene la respuesta correcta sobre cómo omitir entradas no deseadas, pero además de eso, deberían lea los documentos de las funciones que está utilizando. Y verifique su valor de retorno… ya que su llamada anterior habrá regresado EOF y establecer errno = EBADF para señalar su uso indebido de la función. Ignorar los valores devueltos es malo, malo, malo…

    – DevSolar

    8 de junio de 2011 a las 10:57


  • Véase también Uso fflush(stdin).

    –Jonathan Leffler

    15 de septiembre de 2016 a las 5:31

Esto está bien explicado en el Preguntas frecuentes. Ver también: explicación. Las soluciones propuestas:

  • Deja de usar scanf. Utilizar fgets y el sscanf
  • Usa esto para comer la nueva línea

    while((c = getchar()) != '\n' && c != EOF)
    /* discard the character */;
    

El hecho de que vaciar stdin funcione en algunas implementaciones Está Mal.

Algunos proveedores implementan fflush para que fflush(stdin) descarte los caracteres no leídos, aunque los programas portátiles no pueden depender de esto.

Para C en GNU

puedes usar



__fpurge(stdin);

incluya el encabezado stdio_ext.h para acceder a la función. Aunque la publicación es muy antigua, pensé que esto podría ayudar a algunos desarrolladores de Linux.

  • Esto es horrible, incluso si funciona según lo previsto. Imagine lo que sucede si la entrada proviene de un archivo o una tubería.

    –Rafael Lerm

    17/01/2015 a las 23:51

scanf(" %c",&c);

o

scanf(" ");
//reading operation (gets(), fgets(stdin,...) etc)

Los espacios en la cadena de formato scanf() ignorarán cualquier espacio en blanco hasta el primer espacio que no sea en blanco.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad