2012-10-19 43 views
0

我正在C中創建一個程序,我必須接受一個整數才能繼續。我讀了一些問題以使用下面的代碼,但是我的程序在進入任何字符後不久就進入了無限循環。請幫助我在C中驗證整數

int tnum,scancheck; 
printf("Enter the number of teams(Maximum 4)\n"); 
scancheck = scanf("%d",&tnum); 
while(scancheck != 1) 
{ 
    printf("ERROR: Please enter numbers only\n\n"); 
    printf("Enter the number of teams(Maximum 4)\n"); 
    scancheck = scanf("%d",&tnum); 
} 

我用基裏連科的方法,但我的程序進入無限循環上輸入特殊字符,例如L =

編輯 問題已經SOLVED.Thanks傢伙

回答

2

您必須清理撥打scanf之間的stdin。否則,帶有無效輸入的scanf的行爲是將字符放回到流中。然後,它會進入一個無限循環,每次循環讀取相同的錯誤字符。

#include <stdio.h> 

void clean_stdin(void) { 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF) 
     ; 
} 

/* ... */ 

int ret; 
int n; 

do { 
    ret = scanf("%d", &n); 
    clean_stdin(); 
} while (ret != 1); 
+0

我不明白你 –

+0

你能告訴我什麼是stdin嗎? –

+0

這是輸入流(閱讀[this](http://en.wikipedia.org/wiki/Standard_streams#Standard_input_.28stdin.29))。 – md5

-2

如果輸入無效,Scanf會將字符放回標準輸入流。由於我們沒有清除標準輸入流,它正在走向一個無限循環。

嘗試,如果你想從用戶那裏得到的輸入,得到行和分析它寫這篇下方的scanf函數聲明

fflush(stdin); 
+2

未定義的行爲。 – md5

+0

它爲我工作!!非常感謝。這裏幫助最快的社區之一 –

+0

正如@Kirilenko已經指出的那樣,沖洗stdin是未定義的行爲。您應該使用getchar或scanf(「%* c」)手動清空緩衝區。 – Spidey

0

char line[1024]; 
char * err = NULL; 
int num; 

while(err == NULL || *err) 
{ 
    fgets(stdin, line); 
    num = strtol(line, &err, 10); 
} 

直到它滿足要求。

+1

而不是隻發佈一段代碼,請*解釋*爲什麼這段代碼解決了問題。沒有解釋,這不是一個答案。 –

+0

解釋是否正確? – Aubin