我有以下C代码
int selectTask = 1;
while (selectTask > 0 && selectTask < 7) {
printf("Please input which task to test: ");
scanf("%d", &selectTask);
}
这一直按预期工作,直到我输入一个char而不是一个数字,然后才无限循环我的printf。有人知道为什么这样做吗?
答案 0 :(得分:6)
scanf
在行缓冲区之外工作。如果缓冲区已用尽,则换行。但是如果缓冲区中还有东西,那么实际上并不会接受新的输入。
此外,scanf
确实消耗了您告诉它的内容。如果您想要一个数字,它将消耗一个数字,否则将失败。 scanf
的返回值是它成功消耗的事物数。
因此,发生的事情是,您的第一个scanf
读取了新行(因为缓冲区中没有任何内容);如果第一个字符不是数字,则它不会消耗任何东西,并保持原样保留缓冲区,并返回0
为“零消耗成功的事物”。下次您要求一个数字时,它将看到相同的字符,并再次失败,并且不再消耗任何东西。就像这个角色被困在喉咙里。
您可以通过以下方法来解决此问题:在发生故障时读取缓冲区的其余部分,fflush
-打开缓冲区,自己读取字符串并对其进行解析...或者,因为只需要一个字符,就放弃{ {1}},只需使用scanf
。
tl; dr:不要忽略getchar
返回值:)