2012-02-03 5 views
4

я не могу показаться, чтобы выяснить, что случилось с этим кодом:fflush (STDIN) не работает

#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, программа теперь ожидает ввода пользователем имени customer_name. Однако ввод строки с пробелом приводит к ошибке, и программа предполагает, что слово после пробела вводится для следующего запроса.

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: 
+7

'fflush (STDIN)' не определено поведение. – Mysticial

+3

В будущем вместо того, чтобы сбрасывать огромную программу (без номеров строк или указание того, где находится соответствующая информация), попытайтесь опубликовать пример кода, который демонстрирует ту же проблему с минимальным посторонним кодом, чтобы мы могли более четко помочь тебе. (Кроме того, вы даже можете решить это самостоятельно!) –

ответ

1

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

+2

Я не думаю, что это то, что имел в виду OP. Я думаю, что OP предназначался 'fflush (stdin)', чтобы очистить символ новой строки от 'stdin', чтобы он не был захвачен более поздними операциями чтения. – templatetypedef

4

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

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

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

Это будет есть символ новой строки, а не оставлять его в stdin.

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

+0

Я бы предпочел, чтобы OP рассматривал использование 'fgets' вместо' scanf', но у любого, кто пытается 'fflush (stdin)', есть способы пойти еще, поэтому я соглашусь. –

+3

Он не работал должным образом. После входной буквы программа ждет другого входа, затем продолжит работу. –

+0

Хотя 'fflush (stdin)' (или в любом потоке чтения) не определено в ISO C, POSIX определяет поведение в том случае, когда файл доступен для поиска. Это все еще не определено для небывалых потоков, хотя, и stdin обычно не поддается описанию (например, если это терминал или труба). –

0

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

Смежные вопросы