(C 语言)为什么这个程序一开始输入字母后会出现无限循环"Input days:"?然后如何解决?求巨佬解答

iWonderQ 2019-11-26 06:05:05
do
{
t=1;
printf("Input days:\n");
ret=scanf("%d",&n);
if(ret!=1)
t=0;
}while(n<=0||t==0);
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2019-11-28
  • 打赏
  • 举报
回复
本来scanf()期望你输入一个int类型的,结果你输入的是字符,所以此时输入流产生了错误,此时再次调用scanf()函数已经不起作用,所以你的代码会一直循环。可以使用rewind()函数清理指定流中的错误指示符以及文件结束指示符。
	int t = 0;
int ret = 0;
int n = 0;
do
{
t = 1;
printf("Input days:\n");
ret = scanf("%d", &n);
if (ret != 1)
{
rewind(stdin);//-------清理输入流中的错误------------
t = 0;
}
} while (n <= 0 || t == 0);
return 0;

此时即时输入的是字符,scanf()也会在下次调用时停下来等待再次输入。
关于rewind()函数的详细用法,请参考《C++中getchar()的使用方法》
希望能够帮到你!
iWonderQ 2019-11-28
  • 打赏
  • 举报
回复
问题找到了,是因为缓冲区未被读取的问题,在后面加一个while(getchar()!='\n');就可以了。
自信男孩 2019-11-26
  • 打赏
  • 举报
回复
改成while (n <= 0 || t != 0);试试,应该就不会死循环~
自信男孩 2019-11-26
  • 打赏
  • 举报
回复
若ret==0,那么t = 0;就会执行。但是while里面的n <= 0 || t == 0所以都满足,因为n可能是一个随机数,比较大。
铖邑 2019-11-26
  • 打赏
  • 举报
回复
输入怎么ret就会得到0,必须是一直循环的啊

70,009

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧