функция fflush (stdin) не работает - PullRequest
4 голосов
/ 03 февраля 2012

Не могу понять, что не так с этим кодом:

#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();  
#################### edit

Применение решения templatetypedefТеперь программа ожидает ввода данных от имени клиента.Однако ввод строки с пробелом приводит к ошибке, и программа предполагает, что слово после пробела вводится для следующего приглашения.

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:

Ответы [ 3 ]

6 голосов
/ 03 февраля 2012

Функция fflush не удаляет данные из входного потока; вместо этого он используется для передачи данных, буферизованных в выходном потоке, к месту назначения. Это задокументировано здесь . Как видно из этого более раннего вопроса SO , попытка использовать fflush(stdin) приводит к неопределенному поведению, поэтому лучше избегать этого.

Если вы хотите использовать новую строку из возвращаемого символа, введенного, когда пользователь закончил вводить свой символ, вместо этого учтите следующее:

scanf("%c\n", &sect_cat);

Это съест новую строку вместо того, чтобы оставить ее в stdin.

Надеюсь, это поможет!

1 голос
/ 03 февраля 2012

Я думаю, что вы хотели написать fflush(stdout) вместо fflush(stdin).

0 голосов
/ 03 февраля 2012

fflush должен работать с выходным потоком, см. Документы здесь

...