c语言中scanf()读取值的问题

 int get_int(void)
{
    int input;
    char ch;
    while (scanf("%d", &input) != 1)
    {
        while ((ch=getchar()) != '\n')
            putchar(ch);
        printf("is not an interger.\nPlease enter an");
        printf("interger value,such as 25,-178 or3:");

    }
    return input;
}

图片说明
输入里面的a为什么在scanf获取值进入while判断,满足进入循环的条件后,还在缓冲区中,可以继续被getchar()获取 ?按说不是应该被取过的值就不在缓冲区了吗?

我猜测是scanf发现类型不对就没有去把它取出来

我觉得是scanf读取整数时发现字符a不合法(这个时候scanf的返回值是0),但是由于a不是整型,于是scanf忽略了它。因此a还在缓冲区内,所以成立你说的情况了。

scanf,按用户指定的格式从键盘上把数据输入到指定的变量之中
scanf()函数返回成功赋值的数据项数
由于'a'读取不能转成%d,所以返回0,0!=1,接着ch='a',接着输出‘a’,接着有一个换行,==‘\n’,退出while打印printf

应该是scanf没有读到有效数据,数据被忽略了,所以之后还能读到。