我不明白,爲什麼這是一個無限循環,寫控制檯
問題上「給一個intiger」是scanf()
不消耗數據,它不能匹配對指定的格式。它使這些字符在輸入流中未讀。因此,如果您嘗試從具有相同格式的同一個流再次讀取,而沒有通過其他方式消耗至少一個字符,則可以確定輸入將再次不匹配。然後再次。然後再次。
爲避免無限循環,每次匹配失敗後,您需要消耗至少一個不匹配輸入字符。有很多方法可以做到這一點;這裏有一個非常簡單的一個:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
if (scanf("%d", &a)) {
// breaks from the loop on a successful match or an error
break;
}
// consume the remainder of one line of input without storing it
if (scanf("%*[^\n]") == EOF) {
break;
}
} while (1);
}
消耗上遇到不匹配的輸入線,這將產生一些投入會比許多選擇沒那麼令人驚訝的交互行爲的整個剩餘部分。
如果您已經編寫簡潔的代碼情有獨鍾,或者如果你不喜歡break
了一個循環的中間,那麼你可能會這樣寫一樣的東西:
#include <stdio.h>
int main() {
int a;
do {
printf("Give an intiger\n");
} while ((scanf("%d", &a) == 0) && (scanf("%*[^\n]") != EOF));
}
因爲&&
運營商短路,第二個scanf()
調用只有在第一個返回零時執行,並且循環將在第一次迭代之後退出,其中第一次scanf()
調用返回非零或第二次返回EOF
(指示錯誤)。
[intigers are wonderful things!](https://www.youtube.com/watch?v=dJFyz73MRcg) – user4581301
問題是'scanf()'不會消耗與您的字段描述符無法匹配的數據。因此,當您循環再試時,相同的不匹配數據仍在等待處理。 –
它的工作原理!但我真的不明白爲什麼:)) –