2012-03-05 43 views
0

所以。用C編寫應用程序,unix,我有函數,它要求用戶輸入,直到輸入有效。 讓直行:循環運行超過預期C

int inputX() 
{ 
    int result; 
    char input; 
    while(1) 
    { 
     printf("Input x (a, b, c, d, e, f, g, h) :"); 
     scanf("%c", &input); 
     result = validChar(input); 
     if (result >= 0) 
     { 
      return result; 
     } 
     else 
     { 
      printf("Invlid input. Lets try again.\n"); 
     } 
    } 
} 

validChar()檢查,如果輸入的是 - 小時。 如果我輸入 - 一切都很好。 如果我輸入例如1,輸出是

Input x (a, b, c, d, e, f, g, h) :1 
Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) :Invlid input. Lets try again. 
Input x (a, b, c, d, e, f, g, h) : 

我甚至試圖睡眠(),但沒有工作.. C是棘手:|

+1

爲什麼這個問題標記爲'C++'? – 2012-03-05 19:54:26

+1

我懷疑有些數據留在輸入緩衝區中。你在第二次迭代中檢查了「輸入」的內容嗎?它會告訴你很多...... – 2012-03-05 19:55:56

+1

[C循環可能重複兩次打印字符串? (使用scanf(「%c」))](http://stackoverflow.com/questions/9421926/c-loop-prints-string-twice-using-scanfc) – 2012-03-05 19:57:05

回答

4

使用這個把戲擺脫在緩衝區中留下的空白:

scanf(" %c", &input); 
    ^
+0

工程就像一個魅力!如果沒有人告訴我,我覺得有多冷。謝謝:) – Wish 2012-03-05 20:03:29

+0

是的,這是我希望更好地教導的事情之一。與其他轉換說明符(如%d','%i','%o','%x','%s','%f'等)的大多數(全部?)不同,'%c'轉換說明符不會告訴'scanf'跳過任何前導空格。這是完全合乎邏輯的,因爲有時候你想*讀取一個空格字符,但它可能會導致你遇到的問題。你需要在'%c'之前使用上面的訣竅來獲得相同的效果。 – 2012-03-05 23:19:13

0

使用scanf%c將使它吃任何字符。第二次運行可能是您輸入的換行符。

0

第一次打電話1。第二個電話接到\n。閱讀完整一行後解析出來。