学习C语言时遇到的一个不知道为什么的bug,似乎是跳过了scanf()


#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);

啥问题

img

循环里的scanf("%d", &days);前面加上一行 fflush(stdin); 看看

【以下回答由 GPT 生成】

我可以尽力回答你的问题,请给出具体的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

很简单,就是因为你输入的不是int类型的数