求教scanf函数的用法,这段程序到底发生了什么?

这段程序是,阻塞,然后等待你输入一个整数,然后原样输出,然后再阻塞,如此循环。
(编译器:VS2005)

#include<stdio.h>
int main()
{
    int i;
    while(1)
    {
        puts("请输入数字");
        scanf("%d", &i);
        printf("以整数输出这个值:%d\n", i);
    }
}

但实际上如果输入的字母,再循环回来的时候就不会阻塞,而是会疯狂的循环下去……

百度一下,发现scanf函数会从输入缓存(不太懂这是什么东西)中拿走一段数据,如果我输入的是数字的话这个操作就会清空输入缓存,当再次运行scanf函数的时候如果输入缓存是空的,就会产生一个阻塞。

然而还是不明白输入字母的情况下发生了什么。

阅读 1.6k
1 个回答

好吧,最后还是自己找到了答案……

scanf还有一个特点就是:输入缓存中的字符无法匹配格式化说明符的时候,会立即return掉,该缓存字符也不会被删除。
然后配合上面说的特点:只有输入缓存是空的的时候,才会阻塞,否则不会阻塞。
于是,死循环完成。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进