While循环与字符断开

时间:2019-04-05 04:23:04

标签: c

我有以下C代码

int selectTask = 1;
while (selectTask > 0 && selectTask < 7) {
  printf("Please input which task to test: ");
  scanf("%d", &selectTask);
}

这一直按预期工作,直到我输入一个char而不是一个数字,然后才无限循环我的printf。有人知道为什么这样做吗?

1 个答案:

答案 0 :(得分:6)

scanf在行缓冲区之外工作。如果缓冲区已用尽,则换行。但是如果缓冲区中还有东西,那么实际上并不会接受新的输入。

此外,scanf确实消耗了您告诉它的内容。如果您想要一个数字,它将消耗一个数字,否则将失败。 scanf的返回值是它成功消耗的事物数。

因此,发生的事情是,您的第一个scanf读取了新行(因为缓冲区中没有任何内容);如果第一个字符不是数字,则它不会消耗任何东西,并保持原样保留缓冲区,并返回0为“零消耗成功的事物”。下次您要求一个数字时,它将看到相同的字符,并再次失败,并且不再消耗任何东西。就像这个角色被困在喉咙里。

您可以通过以下方法来解决此问题:在发生故障时读取缓冲区的其余部分,fflush-打开缓冲区,自己读取字符串并对其进行解析...或者,因为只需要一个字符,就放弃{ {1}},只需使用scanf

tl; dr:不要忽略getchar返回值:)