2017-04-18 819 views
0

我一直在研究一個需要整數輸入的程序,但是每次意外地輸入一個非整數時,scanf函數停止工作或陷入循環。使用scanf只能輸入整數?

這是什麼,我試圖做一個例子:

int n; 
    printf("please enter 0 or 1\n"); 
top: 
    scanf("%i",&n); 
    if(n == 0) 
    { 
     printf("you entered 0!\n"); 
    } 
    if(n == 1) 
    { 
     printf("you entered 1!\n"); 
    } 
    if(n != 0 && n != 1) 
    { 
     printf("please enter either 0 or 1."); 
     goto top; 
    } 

第三,如果是,如果你沒有輸入正確的號碼發送給您回頂,但這並不信件工作和其他角色。 如果給出非整數輸入,您如何將它發送回頂端?

+1

道奇它用'fgets'進入和應用'sscanf'並檢查它的返回值(研究手冊頁:scanf家族的函數返回值是什麼?)。如果你沒有得到你想要的,轉儲輸入字符串,並得到另一個。 –

+1

「如果給出非整數輸入,你怎麼能把它發送回頂端?」 - >讀取非整數並首先將其扔掉。 – chux

+0

您應該檢查'scanf()'的返回值以識別何時發生錯誤,例如輸入不是數字。當發生這種匹配失敗時,您必須從標準輸入中讀取至少一個字符 - scanf()目前正在窒息 - 否則它將保持在那裏以在下一次嘗試中造成麻煩。 –

回答

0

這可以通過以下替換scanf("%i",&n);呼叫解決:

char buffer[256]; 
char *s = fgets(buffer, 256, stdin); 

if (s != buffer) 
{ 
    // Some error occurred 
    goto top; 
} 

int error = sscanf(buffer, "%i", &n); 

if (error == 0) 
{ 
    // The string read is not a number! 
    printf("please enter either 0 or 1."); 
    goto top; 
} 
0

試試這個

#include <stdio.h> 

int main(void){ 
    int n; 
    printf("please enter 0 or 1\n"); 

    for(;;){ 
     int status; 
     char ch; 
     status = scanf("%i%c", &n, &ch);//check return value of scanf, ch : for check rest input 
     if(status == EOF){ 
      printf("Bye!!\n", n); 
      return 0; 
     } else if(status == 2 && ch == '\n'){ 
      if(n == 0 || n == 1){ 
       printf("you entered %i!\n", n); 
       break; 
      } 
     } else { 
      while(getchar() != '\n');//clear input 
     } 
     printf("please enter either 0 or 1.\n"); 
    } 
    return 0; 
}