La función fflush (stdin) no funciona

4 minutos de lectura

avatar de usuario
Karen Langres Bague

Parece que no puedo entender qué está mal con este código:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>


#define MAX 100
#define TRUE 1
#define FALSE 0

char sect_cat;
char customer_name[MAX];
char customer_number[MAX];      /* error handling is easier */

int prev_unit = 0;
int current_unit = 0;
int consumed = 0;
int set = FALSE;

float init_bill;
float tax;
float total_bill;


    void get_userinfo()
    {

            printf("Enter sector category: ");
            scanf("%c", &sect_cat);
        printf("Enter customer name: ");
        fflush(stdin);
        scanf("%sn", &customer_name);

        set = FALSE;
        while (set == FALSE)
        {
            printf("Enter customer number: ");
            fflush(stdin);
            scanf("%s", customer_number);

            int i;
            int error;
            for (i=0, error=0; i<strlen(customer_number); i++)
            {
                if (isdigit(customer_number[i]))
                {
                }
                else
                {
                    error = 1;
                }
            }
            if (error == 0)
            {
                set = TRUE;
            }
            else
                printf("ERROR: Only numbers are allowed\n");
        }

        printf("Enter previous unit: ");
        fflush(stdin);
        scanf("%d", &prev_unit);

        set = FALSE;
        while (set == FALSE)
        {
            printf("Enter current unit: ");
            fflush(stdin);
            scanf("%d", &current_unit);

            if (prev_unit > current_unit)
            {
                printf("ERROR: Current unit must be larger than previous unit\n");
            }
            else
                set = TRUE;
        }
        consumed = current_unit - prev_unit;
    }



int main()
{


/* Introduce program to users */

        printf("\nThis program computes your electric bill based on these sector categories\n\n");

    printf("\tResidential(R)\n");
    printf("\tIndustrial(I)\n");
    printf("\tCommercial(C)\n\n");

    printf("Press any key to continue...");
    fflush(stdin);
    getchar();  

################### editar

Al aplicar la solución de templatetypedef, el programa ahora espera la entrada del usuario para el nombre_cliente. Sin embargo, ingresar una cadena con un espacio conduce a un error, y el programa asume que la palabra después del espacio se ingresa para el siguiente aviso.

Enter sector category: r
Enter customer name: George of the Jungle
Enter customer number: ERROR: Only numbers are allowed
Enter customer number: ERROR: Only numbers are allowed
Enter customer number:

  • fflush(stdin) es un comportamiento indefinido.

    – Místico

    3 de febrero de 2012 a las 1:30

  • En el futuro, en lugar de volcar un programa enorme (sin números de línea ni indicación de dónde está la información relevante), intente publicar un ejemplo de código que demuestre el mismo problema con la menor cantidad de código extraño posible, para que podamos ayudar más claramente. usted. (Además, ¡incluso puede terminar resolviéndolo usted mismo!)

    – Chris Lutz

    3 de febrero de 2012 a las 1:44

avatar de usuario
templatetypedef

los fflush la función no elimina los datos de un flujo de entrada; en su lugar, se utiliza para enviar datos almacenados en búfer en un flujo de salida al destino. esto esta documentado aquí. Como se vio en esta pregunta SO anterior, tratar de usar fflush(stdin) conduce a un comportamiento indefinido, por lo que es mejor evitarlo.

Si desea comer la nueva línea del carácter de retorno ingresado cuando el usuario terminó de escribir su carácter, considere lo siguiente:

scanf("%c%*c", &sect_cat);

Esto comerá la nueva línea en lugar de dejarla en stdin.

¡Espero que esto ayude!

  • Prefiero que el OP considere usar fgets en lugar de scanfpero cualquiera que intente fflush(stdin) tiene mucho camino por recorrer todavía, así que me conformaré.

    – Chris Lutz

    3 de febrero de 2012 a las 1:41


  • No funcionó como se esperaba. Después de la letra de entrada, el programa espera otra entrada y luego continúa.

    –Karen Langres Bague

    3 de febrero de 2012 a las 2:08

  • Tiempo fflush(stdin) (o en cualquier flujo de lectura) no está definido por ISO C, POSIX define el comportamiento en el caso de que se pueda buscar el archivo. Sin embargo, todavía no está definido para transmisiones no buscables, y stdin normalmente no se puede buscar (por ejemplo, si es un terminal o una tubería).

    – R.. GitHub DEJA DE AYUDAR A ICE

    3 de febrero de 2012 a las 2:43

  • @KarenLangresBague Eso es porque un carácter de espacio en blanco en la cadena de formato de scanf instruye scanf escanear ninguna número de caracteres de espacio en blanco, incluido ninguno, hasta el primer carácter que no sea un espacio en blanco.

    – Spikatrix

    25 de julio de 2015 a las 15:36

Creo que quisiste escribir fflush(stdout) en lugar de fflush(stdin).

  • No creo que esto sea lo que quiso decir el OP. Creo que el OP pretendía fflush(stdin) para borrar el carácter de nueva línea de stdin para que no sea recogido por operaciones de lectura posteriores.

    – templatetypedef

    3 de febrero de 2012 a las 1:33

fflush debería funcionar con un flujo de salida, ver documentos aquí

¿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