2009-12-13 87 views
2

我試圖在eclipse中運行下面的代碼,但控制檯保持空白,直到我停止程序,輸出「輸入下一個值(< = 0退出)2130567168分鐘35509452小時,48分鐘。「一遍又一遍地重複。Eclipse/MiniGW中的scanf問題

似乎scanf正在爲某些原因提供一些默認值...不知道爲什麼。我在程序停止前沒有看到任何東西,所以我認爲它可能與printf沒有被刷新有關,但我確保使用\ n強制刷新。

任何想法?

#include <stdio.h> 
const int MIN_PER_HOUR = 60; // minutes per hour 

int main(void) 
{ 
int hour, min, left; 

printf("Convert minutes to hours and minutes!\n"); 
printf("Enter the number of minutes (<=0 to Quit):\n"); 

scanf("%d", &min); // read number of minutes 

while(min > 0){ 
    hour = min/MIN_PER_HOUR; // truncated number of hours 
    left = min % MIN_PER_HOUR; // number of minutes left over 

    printf("%d minutes is %d hours, %d minutes.\n", min, hour, left); 

    printf("Enter next value (<=0 to quit)"); 
    scanf("%d", &min); 
} 
printf("Done!\n"); 

return 0; 
} 
+2

scanf函數是一個函數,是愚蠢的 - 「這幾乎是不可能做的scanf體面的錯誤恢復,通常讀取整個行(使用fgets或類似的東西)要容易得多,然後使用sscanf或其他技術來解釋它們。「 - 見http://www.eskimo.com/~scs/C-faq/q12.20.html – KernelJ 2009-12-13 18:21:45

+0

檢查scanf的返回值,它可能提供更多的見解 – nos 2009-12-13 18:22:25

+0

雖然我試圖學習C,但這是我教過的東西。令人沮喪的是,即使我認爲代碼是正確的,它也不起作用。 – 2009-12-13 18:23:15

回答

2

Eclipse的終端仿真器可能會不同並且會執行更多緩衝。嘗試在打印輸出和scanf()之間撥打電話fflush(stdout);

+0

工作正常!現在正在打印的行和問題正在被詢問,但輸入迴應並不會使程序繼續。 – 2009-12-13 18:20:34

+1

@Tyler:很高興幫助。如果您覺得它解決了您的問題,您可以考慮接受此答案(單擊我的答案旁邊的複選標記)。另外,你發佈了一個更像是評論的答案;考慮刪除它。 – unwind 2009-12-13 18:51:46

+0

放鬆,感謝您的迴應和建議。你的快速回答非常好。 – 2009-12-13 23:13:41

2

我將代碼移入visual C++,並且按預期工作。我想我的問題應該是:「爲什麼eclipse中的終端模擬會被破壞?」

1

如果有在輸入scanf()代表整數無效字符,該功能將停在該字符,把它留在緩衝區,可以再次閱讀又一次,又一次......

假設您爲第一個scanf()輸入了「14分鐘」。該函數讀取「14」並停在該空間處。然後它將14分配給變量min,程序繼續。

然後,在循環中,程序執行另一個scanf()。這次輸入緩衝區已經有了東西 - 也就是空間的「分鐘」。 scanf()將讀取並忽略該空間,找到不能轉換爲整數的'm'並停止,而不向變量min分配新值,返回值爲0。再次......再次......再次。

所以,你需要做的是在每個scanf()之後清除輸入緩衝區。

你清楚多少?
大概只要ENTER - 這大約是相同fgets()呢:)
例如:

int ch; 
scanf("%d", &min); 
do { ch = getchar(); } while (ch != '\n'); /* empty buffer */ 
+0

謝謝,這是非常翔實的,但不是真的爲什麼它不工作。我還沒有輸入任何內容。 – 2009-12-13 23:14:59