我正在尝试让我的循环接受用户输入,并且如果值是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");
}
}
答案 0 :(得分:3)
当scanf
遇到与给定格式说明符不匹配的字符时,这些字符将保留在输入缓冲区中。 %d
格式说明符期望使用十进制数字,因此一旦读取到非数字,它将停止读取。
通过输入“ g”,scanf
调用不会读取任何内容,并且“ g”将留在缓冲区中。在后续迭代中也会发生同样的情况,从而导致无限循环。
改为使用fgets
来读取一行文本,然后使用sscanf
来尝试从该行中读取数字。如果返回1,则转换成功。如果返回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 :(得分:0)
如果您不信任用户输入,则应将输入作为字符串读取(例如,带有gets),然后解析该字符串。