【C语言篇】? 3. 缓冲区问题
2018-06-18 04:09:09来源:未知 阅读 ()
缓冲区:
输入缓冲区
键盘—》键盘缓冲区—》输入缓冲区—》程序(scanf函数)
我们在键盘上输入的任何东西,会先进入输入缓冲区区域,然后程序从输入缓冲区里把数据一个一个读出来。
输入缓冲区的管理方式:
先进入的数字会被先读出来(输入缓冲区里把前面的数字读走了,才能读后面的数字)
- scanf就是从输入缓冲区里拿数字,如果输入缓冲区的内容和scanf指定的格式类型不一样,它就不动,不会把输入缓冲区里的任何内容转移走。
- 所以你用scanf读一个%d,输入缓冲区输入一个[a 10],用scanf读取一个整数的时候,它读出来的a发现不是一个整数,它又把这个a放回去了。下回再读,还是读的这个a。a始终堵在缓冲区内,后面的数据10读不到。
- 为了解决这个问题,我们在每次读取一个数据后,把输入缓冲区里的数据全清理掉,我不管里面有什么,我这次读完了过后也不管这次是读到还是没读到,反正我这次读完了过后把输入缓冲区全部清理掉,这样的话我保证你下一次读的时候是一个新的开始。
- 每次读完一个数据后,把输入缓冲区里的数据全部清理掉,保证下一次再读的时候一定是一个新的开始,这样就不会因为前一次的错误导致后一次出问题。【清理输入缓冲区的目的:前面的输入出错了,保证不会影响后面的输入】
每次读完一个数据后清理输入缓冲区,保证前面的输入出错了,不会影响后面的输入
scanf("%*[^\n]");
scanf("%*c");
输入缓冲区有这样的一个特点:只有当其中的数据读走的时候,才会清除这个数据。
scanf(数据类型)和缓冲区中的数据类型不一致的时候,便无法读走数据,可能会导致死循环。
解决上面问题的办法:
scanf("%*[^\n]");//*忽略读到的内容,[^\n]任何非\n的字符;将\n之前的所有字符读走
scanf("%*c");//从缓冲区读取一个字符忽略掉
补充:scanf调用失败(主要原因:类型不匹配)返回垃圾值。
char ch;
//下面两行可以完全请空缓冲区中的一行内容
scanf("%*[^\n]");//先将换行符之前的所有内容都清掉
scanf("%c", &ch);//再将\n从输入缓冲区读走
scanf的运行原理
- scanf如果发现输入缓冲区中没有东西,就启动录入
- scanf发现输入缓冲区中有\n,那么他就会去输入缓冲区取值
- 如果发现是自己的菜就会取走放到自己盘子里
- 如果不是自己的菜,就会自己回去了
//检查输入格式是否正确
#include <stdio.h>
int main() {
int num=0;//初始化清零
printf("请输入一个数字:");
while (!scanf("%d",&num)) {
scanf("%*[^\n]");
scanf("%*c");
printf("输入格式错误!\n请输入一个数字:");
}
printf("输入正确!num=%d\n",num);
return 0;
}
每次使用scanf函数读数据后都需要清理输入缓冲区!
输出缓冲区:
程序(printf函数)->输出缓冲区->屏幕
程序的输出可以到达屏幕的条件
输出缓冲区内容显示在屏幕上的条件(至少满足一个):
- 遇到\n
- 程序结束(函数结束)
- 输出缓冲区满了
- 使用fflush(stdout)强制刷新(人工刷新)
举例:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:【改良插入排序】
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C语言程序结构 2020-05-31
- 生产者与消费者模型-有界缓冲区 2020-04-29
- 每日干货丨C++语言主流开发工具推荐! 2020-04-28
- WDK驱动调试问题点滴 2020-04-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash