簡體   English   中英

在scanf獲得意外數據后,C程序無限循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM