2013-11-09 13 views

回答

3

如果您希望循環當用戶按下輸入退出值,scanf()可能不是你的循環返回控制,直到用戶輸入一個值(這被稱爲阻塞) 。

您可以先使用fgets(),然後將輸入傳遞給scanf()的親戚sscanf()以獲得%lf雙精度值。

正如@EdHeal指出的,scanf()有一個你需要檢查的返回值。它將返回成功轉換的事情數量或特殊值EOF,這意味着沒有更多的數據需要讀取。從sscanf()這個返回值將讓您知道用戶是否輸入了值。

所以,把他們放在一起:

int main() 
{ 
    double p, r = 1240; 
    char line[120]; 

    while (r > 0) { 
     printf("\nEnter a amount $: "); 

     fgets(line, 120, stdin); 
     int scanned = sscanf(line, "%lf", &p); 

     if(scanned==0 || scanned==EOF) break; 

     r -= (p *100); 
    } 

    return 0; 
} 

更多有關fgets()以及每個參數是檢查其man page

+0

無論我是否輸入數字,該解決方案都可以工作。如果我輸入一個數字並按回車鍵,將運行'r - =(p * 100);'然後退出循環。我不想那樣。這不是循環的條件。 r> 0 – Oscar

+0

因爲p乘以100,所以任何大於12的值都會退出,因爲r是1240開始。我剛剛從原來的帖子中找到了該行。 –

+0

對不起。我的錯。它應該是'r = 12.40;'和'r - =(p/100)'(我剛剛修復了這篇文章中的主代碼) – Oscar

0

當用戶按此處輸入時,p變量不一定變爲NULL。你應該嘗試得到一個特定的數字或字符退出循環。除了scanf函數等待用戶輸入內容之外,當您按Enter鍵而不輸入任何值時,程序不會繼續。

3
  1. p不是指針,而是NULL等於零(通常)。所以這條線有點無意義 if(p == NULL) { break; }
  2. 閱讀scanf的手冊頁 - 即http://linux.die.net/man/3/scanf。它返回你需要檢查
相關問題