簡體   English   中英

在while循環中使用scanf進行無限循環

[英]Infinite loop with scanf in while loop

我是C語言的初學者,我試圖在數字中加入一個范圍,但是當鍵入一個超出范圍的字母(例如:p)時,就會出現無限循環。 如果我輸入的數字超出范圍,則可以使用。 我讀了一下,我認為這是緩沖區和函數scanf的問題,當我按“ Enter”時,我會包含\\ n。 因此,我嘗試通過使用char進行掃描進行清潔,但是沒有成功。 我還嘗試在%x之前放置一個空格(''),但沒有用。 我寫了無效的字母后,scanf被忽略了; 如果我輸入了無效的數字,該程序將起作用。

#include <stdio.h>

int main()
{
    int validity, pos; //validity 0:not valid, repeat the loop; validity 1: valid number
    char enter;

    while (validity == 0) {
        printf("Player1 1, type the position in hexadecimal (1 to f):\n");
        scanf(" %x%c", &pos, &enter); //here, the number pos is already in decimal

        if (pos == NULL){
            pos = 99; //if the letter typed is improper, I set 99, because is out of range
        }

        if(pos<=15 && pos >=0){
            validity = 1;
        } else {
            printf("Invalid number, out of range\n");
            validity = 0;
        }
    }
}

循環中的第一次, validity根本沒有定義的值。

它可能是1 ,可能是0 ,可能是65,532

您應該為其分配一個初始值。

int validity = 0, pos; //validity 0:not valid, repeat the loop; validity 1: valid number

您將pos聲明為int 它永遠不會為NULL 它將具有整數值。

這行沒有意義:

if (pos == NULL){

您還應該初始化該變量。

int validity = 0, pos = 99; //validity 0:not valid, repeat the loop; validity 1: valid number

C沒有原始數據類型的默認值。 因此在線

int validity, pos;

您可能應該將validity設置為某個默認值,例如0,以便無論輸入是什么(有效或無效),循環至少運行一次。 或者do while在這種情況下使用do while循環似乎是更合乎邏輯的決定。

do
{
 //Your code
} while(validity == 0);

在這種情況下,您不必擔心將默認值設置為validity

同樣正如@abelenky先前指出的那樣,檢查pos是否為NULL在技​​術上也是一個壞主意。 您也可以跳過這一部分

if (pos == NULL)
{ 
  pos = 99;
}

由於pos被聲明為int ,如果pos的值不在0到15之間,那么這部分代碼會自動將其聲明為無效。

if(pos<=15 && pos >=0)
{ 
  validity = 1;
} 
else 
{ 
  printf("Invalid number, out of range\n");
  validity = 0;
}

因此,無需再進行其他塊檢查其有效性。

無限循環的原因是,如果輸入字母,則其后的“ \\ n”將作為下一個循環中scanf(...)函數的輸入。 因此,您只需添加“ getchar()”即可對其進行修復。 注意忽略數字后的“ \\ n”。

不同的是,當您鍵入超出范圍的數字時,可以用十六進制解析它,也可以打印以查看。 但是字母不能(必須在af之間)。

您可以參考以下內容:

#include <stdio.h>
int main(int argc, char *argv[])
{

   int validity=0, pos=99;
   while (validity == 0){
       printf("Player1 1, type the position in hexadecimal (1 to f):\n");      
       scanf("%x", &pos); 

       if(pos<=15 && pos >=0){
          validity = 1;
       }else {
          printf("Invalid number, out of range\n");
          getchar();
       }
   }
}

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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