循环无法正常工作
Loop is not working correctly
我试图让我的循环接受用户输入,如果值为 1 到 9,则循环结束(这部分工作正常)。但是,如果用户输入的不是数字 1 - 9,那么程序应该显示一条错误消息,然后再次要求用户输入,并重新检查输入是否是数字 1 - 9。测试时,如果我输入字母 'g',然后程序无限期地吐出错误消息,而不是一次。这是为什么?
代码如下:
int playerMove;
printf("Please enter a number 1 - 9:\n");
for(;;)
{
scanf("%d", &playerMove);
if(playerMove > 0 && playerMove < 10)
{
printf("\nYou have selected position %d. \n\n", playerMove);
break;
}
else
{
printf("Invalid selection. Please enter a number 1 - 9:\n");
}
}
如果您不信任用户输入,您应该将输入读取为字符串(例如使用 gets),然后解析该字符串。
当scanf
遇到与给定格式说明符不匹配的字符时,这些字符将留在输入缓冲区中。 %d
格式说明符需要十进制数字,因此一旦读取到非数字,它就会停止读取。
通过输入 "g",scanf
调用什么也读不到,"g" 留在缓冲区中。随后的迭代也会发生同样的情况,导致无限循环。
改为使用 fgets
读取一行文本,然后使用 sscanf
尝试读取该行中的数字。如果是 returns 1 则转换成功。如果它 returns 0,则读取了非数字输入并且您读取了另一行:
for(;;) {
char line[100];
fgets(line, sizeof(line), stdin);
int result = sscanf(line, "%d", &playerMove);
if (result == 1 && playerMove > 0 && playerMove < 10)
printf("\nYou have selected position %d. \n\n", playerMove);
break;
} else {
printf("Invalid selection. Please enter a number 1 - 9:\n");
}
}
我试图让我的循环接受用户输入,如果值为 1 到 9,则循环结束(这部分工作正常)。但是,如果用户输入的不是数字 1 - 9,那么程序应该显示一条错误消息,然后再次要求用户输入,并重新检查输入是否是数字 1 - 9。测试时,如果我输入字母 'g',然后程序无限期地吐出错误消息,而不是一次。这是为什么?
代码如下:
int playerMove;
printf("Please enter a number 1 - 9:\n");
for(;;)
{
scanf("%d", &playerMove);
if(playerMove > 0 && playerMove < 10)
{
printf("\nYou have selected position %d. \n\n", playerMove);
break;
}
else
{
printf("Invalid selection. Please enter a number 1 - 9:\n");
}
}
如果您不信任用户输入,您应该将输入读取为字符串(例如使用 gets),然后解析该字符串。
当scanf
遇到与给定格式说明符不匹配的字符时,这些字符将留在输入缓冲区中。 %d
格式说明符需要十进制数字,因此一旦读取到非数字,它就会停止读取。
通过输入 "g",scanf
调用什么也读不到,"g" 留在缓冲区中。随后的迭代也会发生同样的情况,导致无限循环。
改为使用 fgets
读取一行文本,然后使用 sscanf
尝试读取该行中的数字。如果是 returns 1 则转换成功。如果它 returns 0,则读取了非数字输入并且您读取了另一行:
for(;;) {
char line[100];
fgets(line, sizeof(line), stdin);
int result = sscanf(line, "%d", &playerMove);
if (result == 1 && playerMove > 0 && playerMove < 10)
printf("\nYou have selected position %d. \n\n", playerMove);
break;
} else {
printf("Invalid selection. Please enter a number 1 - 9:\n");
}
}