C语言输入非int类型字符时do-while校验scanf返回值触发死循环问题
问题成因
scanf匹配输入失败时,不会自动丢弃输入缓冲区中无法匹配的内容,错误输入会永久残留在缓冲区内。- 当你输入非int类型数据后,
scanf("%d", &n)返回0进入下一轮循环,后续scanf会直接读取缓冲区里残留的错误数据,再次匹配失败,由此形成无限循环,不会等待新的用户输入。
解决办法
匹配失败后主动清空输入缓冲区的残留内容即可,推荐使用跨平台的标准实现,不要用非标准的fflush(stdin)(仅在部分编译器上生效,可移植性极差)。
修改后的参考代码如下:
int n; do { printf("请输入int类型数据:"); if (scanf("%d", &n) == 1) { // 输入合法,跳出循环 break; } // 逐字符读取缓冲区内容直到换行符,清空所有错误残留 while (getchar() != '\n'); printf("输入不合法,请重新输入\n"); } while (1);
内容的提问来源于stack exchange,提问作者theEncrypter
相关产品推荐
相关产品推荐

