检查 的返回值scanf
。它将返回成功匹配和分配的项目数。在这种情况下,如果您输入一个字符串,那么它将不会被匹配和分配,但是该字符串会留在输入缓冲区中,并且scanf
尝试在每次迭代中读取它并且失败,因此出现了问题。
您可以将代码更改为:
int main () {
int secret, answer;
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
if (scanf ("%d",&answer) != 1)
{
printf ("\nPlease enter an integer\n\n");
scanf ("%*s");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
注意里面的if
行scanf ("%*s");
是做的。在 中%*s
是*
输入抑制指示器,这表明%s
将读取一个字符串(代表 ),但*
表明尽管将从输入中读取该字符串,但它将被丢弃。这样做是为了简单地丢弃先前输入的字符串,而scanf ("%d",&answer)
. 如果您不丢弃缓冲区中的字符串,它将保留,并且每次迭代scanf ("%d",&answer)
都将无法匹配任何整数,因为它将遇到输入缓冲区中的剩余字符串。
另一方面,您可以读取一个字符串并将该字符串转换为整数。
如下所示:
int main () {
int secret, answer;
char buff[128];
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
scanf ("%s",buff);
if ((answer = atoi (buff)) == 0)
{
printf ("\nPlease enter an integer\n\n");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
atoi ()
将字符串转换为整数(以 10 为基数)。如果包含整数的字符不包含有效数字,它将返回0
。检查它,我们可以检测用户是否正确输入。另外因为您的应用程序需要输入 1 和 10 之间的整数,因此不包括 0,因此可以将 0 视为无效。为了更好地控制检测无效整数格式以及字符串中错误的位置,请使用strtol ()