2014-04-07 233 views
2

我需要製作一個函數,該函數從用戶那裏獲取輸入並確保它是一個整數並且不包含任何字符。檢查輸入是否是整數

我寫了這個代碼,它完美地適用於整數和單個字符。但是,如果我輸入dfd即終止多個字符輸入。下面是我的代碼用gcc在Linux編譯:

#include <ctype.h> 

int getint() 
{ 
    int input = 0; 
    int a; 
    int b, i = 0; 
    while((a = getchar()) != '\n') 
    { 
     if (a<'0'||a>'9') 
     { 
      printf("\nError in input!Please try entering a whole number again:"); 
      input=0; 
      fflush(stdin); 
      return getint(); 
     } 
     b = a - '0'; 
     input = ((input*10) + b); 
     i++; 
    } 
    return input; 
} 
+0

朋友學習[縮進](http://www.cs.arizona.edu/~mccann/indent_c.html)。 –

+0

你爲什麼要對stdin執行fflush?它是一個輸出函數(除非我要學習一些非常模糊的東西)。你是不是指fpurge? – DrC

+2

'fflush(stdin)'的行爲不是由C標準定義的。它由一些實現和POSIX定義,但在這裏沒有用。你可能想要做的是讀取和放棄輸入字符,直到你看到'\ n''或'EOF'。 –

回答

1

問題可能是調用fflush(stdin)未定義。 fflush用於刷新輸出流,而不是輸入流。嘗試用另一種方式替換它以清除剩餘的輸入緩衝區,如while (getchar() != '\n');,然後查看是否可以解決問題。 (你也許應該做一些更強大的工作,比如捕獲EOF,這樣你就不會陷入無限循環)

+0

謝謝..工作就像一個魅力!這是清除輸入緩衝區的最簡單方法。以防萬一有其他選擇嗎? –

+0

請提出問題 –

1

改變fflushfpurge造成你的程序,開始爲我工作。

+0

'fpurge'是非標準且不可移植的。引用其手冊頁:「通常放棄輸入緩衝區是一個錯誤。」 –

+0

fpurge不包含在stdio.h中我在哪裏可以找到它? –

2

在輸入流上調用fflush會調用未定義的行爲。即使你的實現爲輸入流定義它,它也不是可移植的。沒有標準的方法來刷新輸入流。因此,fflush(stdin);是不正確的。你應該閱讀這些字符並丟棄它們,直到包含stdin緩衝區中的換行符。我建議對你的功能進行如下修改。

int getint(void) { 
    int input = 0; 
    int a; 

    while((a = getchar()) != '\n') { 
     if (a < '0' || a > '9') { 
      printf("Error in input!Please try entering a whole number again:\n"); 
      input = 0; 

      // read and discard characters in the stdin buffer up till 
      // and including the newline 
      while((a = getchar()) != '\n'); // the null statement 
      return getint(); // recursive call 
     } 
     input = (input * 10) + (a - '0'); 
    } 
    return input; 
} 

另外,請仔細閱讀本C常見問題 - If fflush won't work, what can I use to flush input?

+0

有道理,請提出問題! –