所以我的問題是以下。while循環掃描C
int n=0;
while(n<=0)
scanf("%d",&n);
此代碼進入無限循環,我不知道爲什麼。當用戶輸入數字> 0時,循環應該停止。
並感謝:)
所以我的問題是以下。while循環掃描C
int n=0;
while(n<=0)
scanf("%d",&n);
此代碼進入無限循環,我不知道爲什麼。當用戶輸入數字> 0時,循環應該停止。
並感謝:)
我想你應該改變你的編譯器,因爲我得到了很好的結果。
您可能在其他地方遇到問題。
您可以點擊這裏:
代碼:
#include<stdio.h>
main()
{
int n = 0;
while (n <= 0)
scanf("%d",&n);
printf("%d",n);
}
Input:
-5
4
Output:
4
好的謝謝。我在linux上使用gcc。 – user2116077 2013-02-27 16:24:19
我試着用3個編譯器。它的工作正常。 – Arpit 2013-02-27 16:25:10
對不起,我非常感謝。我明天會和老師談談,這似乎是一個海灣合作委員會的問題。 – user2116077 2013-02-27 16:28:13
while (n <= 0)
// something
意味着「做一些事情而n
值小於或等於0
」。只要確保在條件n <= 0
正在評估時n
已初始化。使用未初始化的變量會產生未定義的行爲。
你應該這樣做:
int n = 0;
while (n <= 0)
scanf("%d\n",&n);
是的,我知道,所以當掃描得到n> 10時,它應該停止對嗎? – user2116077 2013-02-27 15:59:26
@ user2116077它當然應該 - 看到我的答案。 – 2013-02-27 16:00:06
已經做到了,相同的無限循環。 – user2116077 2013-02-27 16:08:14
一遍又一遍又一遍又一遍......
stdin
(通常)行緩衝 - 一個具有按<enter>
使終端傳輸字符到你的程序。所以現在緩衝區中有一個懸掛的換行符,並且scanf()
將在下一次迭代期間嘗試讀取它,但它不是一個整數,所以它會失敗並且不會更改變量的內容。爲了解決這個問題,使scanf()
吃換行符:
scanf("%d\n", &number);
(哦,是的,n
也用於初始化,但似乎你的代碼進入循環無論如何,所以這不是問題做初始化,。雖然,否則你將面臨其他奇怪的錯誤。)
我已經試過了,沒有工作,但無論如何感謝:) – user2116077 2013-02-27 16:02:13
@ user2116077從這個答案的質量(抱歉,但...)推導出來 - 你代碼中可能存在其他問題/語義錯誤/未定義的行爲。檢查這些。 – 2013-02-27 16:03:00
@ H2CO3在C++它是UB,但在c的情況下這是真的嗎? – Arpit 2013-02-27 16:03:19
既然你聲稱嘗試過的東西,他們沒有工作(雖然我不明白爲什麼)讓我們嘗試別的。讓我們使用程序員的最好的朋友:printf
。如何努力,而不是運行此代碼:
int n = 0;
while(n <= 0)
{
printf("Please enter a number: ");
scanf("%d\n", &n);
printf("I see you entered: %d\n", n);
}
printf("Done with the loop. The value of n is: %d\n", n);
這將讓你看到它在讀什麼電腦是做什麼值,因爲它讀取它們。嘗試用上面的代碼替換你的代碼,讓我們看看會發生什麼。
現在它停止後,我再次進入,這是更好的。 – user2116077 2013-02-27 16:14:57
告訴我們計算機打印出什麼... – 2013-02-27 16:15:17
請輸入數字:5 我看到你輸入了:5 完成循環。 n的值是:5 – user2116077 2013-02-27 16:19:09
代碼可能永遠不會進入循環可言 - 因爲'N'未初始化。你怎麼知道它在循環?你輸入了一個數字,然後按ENTER? – 2013-02-27 16:00:16
我剛剛編譯了這個,當我輸入值1並按回車時,它退出循環。我認爲你的問題在於你的程序中的其他地方。你可以嘗試把'n'變成'volatile int',以確保你沒有得到優化問題。 – mrh 2013-02-27 16:17:44
我*非常*懷疑這個問題是由優化器造成的,'volatile'不會修復它。 – 2013-02-27 16:18:44