[英]C program loops infinitely after scanf gets unexpected data
我有一個程序,我希望輸入整數在2到64之間,所以我把scanf
放在do { ... } while
循環中。 這是我最初測試的代碼:
int initialBase;
do {
printf("Initial base: ");
scanf("%i", &initialBase);
} while (initialBase < 2 || initialBase > 64);
問題是每當輸入不是有效整數時,它只是無限地輸出printf
語句而不再提示用戶輸入,立即充斥控制台。 為什么會發生這種情況,什么是更好的閱讀輸入方式,滿足我想要的條件?
當scanf()
失敗時,參數不會自動初始化,未初始化的值可以是任何值,因此它可能小於2
或大於64
沒有人知道。
試試這個
int initialBase;
/* some default value would be good. */
initialBase = 2;
do {
printf("Initial base: ");
if (scanf("%i", &initialBase) != 1)
break;
} while ((initialBase < 2) || (initialBase > 64));
該檢查將退出循環,如果你輸入的東西是不是一個數字,的initialiazation initialBase
只是它在你的情況可能會阻止您的行為描述一個好習慣,但在這種情況下,它的存在,以防止訪問未初始化while
循環后的值。
循環沒有停止的原因是因為scanf()
在它們不匹配時在輸入流中留下了一些字符,並且當這些字符仍然存在時再次調用scanf()
將使scanf()
繼續等待有效輸入,但是立即返回流中當前無效的輸入,如果你想繼續閱讀,嘗試從流中讀取字符,直到找到'\\n'
,這樣
int initialBase;
initialBase = 0;
do {
printf("Initial base: ");
if (scanf("%i", &initialBase) != 1)
{
while (fgetc(stdin) != '\n');
continue;
}
} while ((initialBase < 2) || (initialBase > 64));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.