2012-09-28 141 views
0
char again; 
do { 
      counter = 0; 
      while (counter < 3) { 
       printf("Please enter a number: "); 
       scanf("%d", &num); 
       counter++; 
       sum += num; 
      } 
      if (counter == 3) { 
       printf("Would you like to continue? [Y]Yes [N]No:"); 
       scanf("%c", &again); 
      } 
     }while (again == 'Y'); 

我似乎無法弄清楚爲什麼這不起作用。如果我輸入Y,它會中斷,如果輸入N,它會中斷。我需要循環,直到用戶輸入「N」退出程序並且沒有其他字母。Broken Do/While Loop

+1

是什麼'again'? – squiguy

+0

它在while循環中變化... –

+0

順便說一句,你不應該寫'} while(again!='N')'? – rodrigo

回答

8

更改scanf呼籲:

scanf(" %c", &again); 

的訣竅是在%c前的空間:它指示scanf函數返回你的N或Y.否則你會被讀取之前忽略任何空白字符從以前的scanf電話返回馬車。

man 3p scanf(POSIX的一個):

的一個或多個空白字符構成的指示字應通過讀取輸入來執行,直到沒有更多的有效輸入可以被讀取,或至多 第一字節不是空白字符,它仍然未讀。

這是一個複雜的功能。我建議您仔細閱讀手冊頁:它可以做得比大多數人想象的要多得多。

+0

啊,修好了:)謝謝。 –

+0

@iccthedral:C中的指令是什麼? AFAIK,'scanf'是一個函數。 – rodrigo

+1

@iccthedral:啊!他們被稱爲_directives_,而不是指令。您可以在_scanf_函數的任何_good_參考(如POSIX手冊頁(請參閱更新後的答案中的鏈接))中閱讀它。 – rodrigo

0

問題是scanf("%c", &again)在最後一個數字之後讀取換行符,這就是循環總是中斷的原因。這也是爲什麼人們迴避scanf()有利於fgets()sscanf();你往往會得到更好的診斷和更少的討厭的陷阱。

你怎麼可以自己調試呢?

您可能已經打印的,因爲它被讀出數據 - 增加:

printf("Read: %d\n", again); 

scanf()後。此外,你應該檢查每個scanf()通話,以確保你所得到的數據,你希望:

if (scanf("%c", &again) != 1) 
    ...oops — error handling...