2012-02-03 11 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

templatypypedefのソリューションを適用すると、プログラムは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が 'stdin'から改行文字を消去して、後の読み込み操作で取り上げないように' fflush(stdin) 'を意図していたと思います。 – templatetypedef

4

fflush関数は、入力ストリームからデータをフラッシュしません。代わりに、出力ストリームにバッファされたデータを宛先にプッシュするために使用されます。これは文書番号hereです。 this earlier SO questionに見られるように、fflush(stdin)を使用しようとすると、未定義の動作につながるため、回避することをお勧めします。あなたはリターン文字から改行を食べたい場合は、ユーザーが自分の文字を入力し終わったときに入力され、代わりに次の点を考慮し

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

これはむしろstdinでそれを残すよりも、改行を食べるようになります。

希望すると便利です。出力ストリームで動作するはず

+0

私はOPではなく、 'scanf'の代わりに' fgets'を使うことを考えていますが、 'fflush(stdin)'しようとする人はまだ行く方法があるので、解決します。 –

+3

期待どおりに動作しませんでした。入力文字の後、プログラムは別の入力を待ってから処理を進めます。 –

+0

'fflush(stdin)'(または読取りストリーム上)はISO Cごとに定義されていませんが、POSIXはファイルがシーク可能な場合の動作を定義します。それでも未知のストリームについてはまだ定義されておらず、 'stdin'は普通は見分けがつきません(例えば端末やパイプの場合)。 –

関連する問題