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