c语言中scanf等函数关于输入流缓冲区
来源:互联网 发布:php 去除井号 编辑:程序博客网 时间:2024/04/29 13:48
突然想起来c语言中常用的scanf函数还有getchar函数有可能会遇到关于缓冲区未被清空导致输入出现问题的情况。
刚刚学c的时候有道练习题遇到了键盘输入缓冲区出现的问题,然后今天同学做课设题目也遇到了相同的问题老师居然一时没解答出来--。
回来看了下大概的解释,写下来算是作为记录吧。
相对于getche()getche(),scanf()和getchar()是stdioh库里的函数,像我这种初学c的基本上输入都用getchar()和scanf()来解决。然而遇到大量输入的话就可能出现问题--。比如
#include<stdio.h>int main (){ char c; while((c = getchar())!='\n') printf("%c",c); printf("end"); return 0;}
当你输入多个字符时这一段代码就会把你输入的一整串字符串都输出来,getchar()不是只读取一个字符吗--。
然而这并不是偶然.....
getchar()并不是从键盘直接读取字符,而是等你输入完成,比如输入一整串字符你会按个回车表示你输入完成了对吧,那么这个回车就是一个标志,从键盘读到回车符的时候程序才会进入getchar()这个函数,而你之前输入的东西都会被存放在内存中有一块叫输入流缓冲区的地方,任晗getchar()就开始在缓冲区读取字符,当它读完第一个字符后释放了那个字符所占的内存,但是你之前输入的是一大串字符,后面还有一段串字符等着被getchar()“临幸”,所以上述程序会把你输入的全部都输出。
那么你做一大段输入的时候就有可能出现某处该输入却被程序直接跳过然后然后然后你就会发现被跳过的居然有值....明明我都没输入呢.....
所以在多输入语句的情况下需要清空输入流缓冲区来保证你的每一个需要输入的语句都能得到你想给他的值。
在windows环境下可以用fflush(stdin);
rewind(stdin);
等函数来清空输入流缓冲区....也可能还有其他函数可以达到目的...毕竟程序的世界很奇妙。
然而上面说到的两个函数在linux环境下不适用,就好像system("cls")清屏函数在windows下可以用在linux得改用system("clean")....哈哈
那么在linux下可以用setbuf(stdin,NULL);
os x下不清楚--。毕竟没用过x_x
放一篇讲的很详细的大神的blog点击打开链接
- c语言中scanf等函数关于输入流缓冲区
- C语言中scanf函数与输入缓冲区
- C语言中scanf函数与输入缓冲区之间的关系
- C语言中scanf格式化输入函数
- C语言中scanf格式化输入函数
- C语言中scanf格式化输入函数
- C语言中scanf格式化输入函数
- 关于输入scanf()中缓冲区的几个问题
- C语言中scanf函数中%[]格式控制符用法 scanf清除缓冲区
- C语言-关于输入缓冲区
- C语言中scanf与键盘缓冲区
- C语言中scanf()和缓冲区
- 【学习笔记】关于c语言scanf缓冲区输入出错的问题解析及解决方法
- C语言scanf函数输入时键盘缓冲区\n的问题
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- C语言编程在Xcode中Scanf 输入跳过以及清空键盘缓冲区总结
- C语言中scanf函数输入回车符的问题
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
- placement new的用法
- hdu 1686 Oulipo
- Android support v7 ActionBarActivity 过时
- PrintDocument,PrintDialog与PrintPreviewDialog
- c语言中scanf等函数关于输入流缓冲区
- Android启动Service的两种方式之startService()
- 2015校招名企offer薪资大曝光
- 06多次查询某区间内topk问题
- Ajax的一个实例及代码
- OJ刷题---计算圆问题(小数点精确失误)
- 驱动程序makefile解读
- JavaWeb_Web开发入门
- 单播、多播(组播)和广播的区别