2013-10-09 60 views
3

下面給出的是我的代碼片段。我學會了更好地使用fscanf而不是scanf。但fscanf不等待輸入fscanf for stdin不提示輸入

switch (argc) { 
      case 2: printf("\nEnter the subject code: "); 
       while(fgets(temp_op->subject, BUF_NOTES, stdin)==NULL); 
      case 3: printf("\nEnter the topic: "); 
       while(fgets(temp_op->topic, BUF_TOPIC, stdin)==NULL); 
      case 4: printf("\nEnter the Level: "); 
       flag = fscanf(stdin,"%d",&temp_op->level); 
      case 5: printf("\nEnter the Answer Key: "); 
       while(fgets(temp_op->key, BUF_KEY, stdin)==NULL); 
      case 6: printf("\nEnter any additional notes(optional): "); 
       while(fgets(temp_op->notes, BUF_NOTES, stdin)==NULL); 
       break; 
      default:printf("\nExcess Arguments"); 
     } 

問題是針對case 5。 fgets沒有等待輸入,但情況6很好。

但是,如果我註釋掉case 4行「flag = ...」,那麼下一個fgets將提示輸入。奇怪的。我想知道爲什麼以前的fscanf會影響後面的fgets。我的結構定義是:

typedef struct { 
int mode ; 
int level; 
char subject[BUF_SUBJECT], topic[BUF_TOPIC], notes[BUF_NOTES], key[BUF_KEY]; 
} operation; 

完整的源代碼是在http://pastebin.com/HVvGC3B7

出了什麼問題?

+3

是否'fscanf'留在緩衝區中的換行符? – nhgrif

+0

嘗試'fflush()'強制輸出緩衝區發出,通常發生在'\ n'上。 – PaulProgrammer

+0

順便說一句,你忘記'break;'在開關 –

回答

5

您在混合scanf()fgets() - 最好避免。

fscanf(stdin,"%d",...\n保留在輸入隊列中,以下fgets()消耗而不等待額外輸入。

推薦使用fgets() thoguhout並使用sscanf(buffer, "%d", ...來獲得您的整數。

+0

@Jay Aurabind BTW:看起來像一個無限循環'while(fgets(...,...,stdin)== NULL)'你應該得到一個EOF或者I/O錯誤 – chux

+0

但是當我需要使用sscanf從標準輸入輸入時,我應該用什麼來代替'buffer'?stdin會產生警告,並且也不起作用,因爲緩衝區應該是手冊中提到的'const char *',只有' getchar()'似乎工作 –

+0

Reggle循環無限循環,其他回合!:P我得到循環,如果我不把NULL NULL :) –

2
   case 4: printf("\nEnter the Level: "); 
       flag = fscanf(stdin,"%d",&temp_op->level); 
       //Here Return key left in buffer 
      case 5: printf("\nEnter the Answer Key: "); 
       while(fgets(temp_op->key, BUF_KEY, stdin)==NULL); // escapes because of newline 

爲了避免簡單地case 5前加getchar();

或chux建議你也可以使用sscanf()