#include <stdio.h>
#define D_PER_W 7
int main(void)
{
int days;
int weeks, left_days;
days = 0;
weeks = 0;
left_days = 0;
printf("请输入天数(小于等于零退出):");
scanf("%d", &days);
while (days > 0)
{
weeks = days / D_PER_W;
left_days = days % D_PER_W;
printf("%d days are %d weeks %d days\n", days, weeks, left_days);
printf("NEXT NUMBER?\n");
scanf("%d", &days);
}
return 0;
}
如上代码运行时如果正常输入整数没有问题,但是当第一次输入整数,程序运行到printf("NEXT NUMBER?\n");后再输入一个字符(亲测a / *q 其他字符应相同)会进入无限循环,好像是每次都跳过了scanf函数
吐槽:把问题文字放图片前面,不然很多人都看不到。
正文:
这是scanf函数的用法导致的。
你的代码是
scanf("%d", &days);
while (days >0)
//其他操作
scanf("%d", &days);
如果第一次输入正确的值,days大于0。
之后输入不合法的字符,则scanf无法获取整数,days就保持原值,这是导致死循环的第一个因素。
第二个因素是,scanf读入时,若发现这个字符不是自己想要的,就会主动把它push back回去。
这个是有必要的,举个例子
scanf("%d%c", &days, &c); 如果输入 5t ,则 days =5, c ='t',是我们期望的效果。
因为当scanf 处理%d但读到 t 的时候,发现过头了,这时得把5赋给变量days,并把t放回输入流,这样后面的%c才能读到t,并把它赋给变量c。
但你的循环里是 scanf("%d", &days); 只要一接到不是整数的非空白字符,比如't',那么循环内后续的scanf永远读到的都是这个 't',
但scanf期望的是整数 %d,故一直失败一直循环。
所以简单改法是加个scanf返回值判断,改三行:
int count = scanf("%d", &days);
while (count > 0 && days > 0)
//其他操作
count = scanf("%d", &days);
啥问题
循环里的scanf("%d", &days);前面加上一行 fflush(stdin); 看看
【以下回答由 GPT 生成】
我可以尽力回答你的问题,请给出具体的问题。
很简单,就是因为你输入的不是int类型的数