- 浏览: 2052203 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
1.getchar
先引用一下前人的成果(有修改)^_^:http://blog.csdn.net/cxyol/archive/2006/03/18/628324.aspx
getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了。而getch()和getche()是conio.h中的库函数,它的作用是从键盘接收字符。getchar带有显示。
与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束(前提是缓冲区没有数据),回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
|
这个程序你运行一下,相信你又会有疑问了。这个就是从缓冲区中读取了例子。第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。
|
程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这里怎么?
因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。
例子中循环条件里的'\n'实际上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循环,当然意思是如果你输入“12345a213123\n”那么只会输出到a,结果是12345a。
再次注意:用getchar()它是从“流”中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符,上面举过例子了),如果流队列不为空,执行getchar()就继续放水,直到把回车符也放空为止,空了之后再在执行getchar()就停下等待你的输入了;我们用getch()为什么每次都是等待用户的输入呢?因为getch()是从键盘接收,即时的接收,并不是从stdin流中去读取数据。
补充:按键盘上的回车产生了2个字符:回车符('\r')和换行符('\n')。回车符'\r'(CR:carriage return:倒车)使光标回到这行的首部,换行符('\n')(new line)然后再换行。
所以当输入字符'w',并按下回车键以后。首先得到回车符。那个getchar函数结束了。 但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的'\n'.
3.如何清空输入缓冲区的内容?
如果我想让getchar()每次都能够等待用户输入的话就要清空缓冲区,下面就介绍方法(不同平台)
C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。
对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)
|
这里说到gcc编译器没有定义fflush的实现,我们一般用getchar();来清除缓冲区.
下面是我的讨论:
先来一段code:
|
输入:
ssss回车
得到:
ssss
光标处(等待输入)
说明:此时程序没有结束,进行到for循环,因为并没有字符a出现,所以还没跳出for循环.键入回车后,getchar
依次从缓冲区内取出(for循环):'s''s''s''s''\n'
如果我们输入:
ssssa回车
得到:
ssss光标处(等待输入)
说明:程序已经跳出for循环,但是由于我们用getchar();清除了换行'\n',后面第7句c=getchar();需要你输入一个字符(因为ssssa后面并没有新的字符),所以程序仍然没有结束.如果我们注释掉getchar();这一句,那么得到:
ssss
光标处(程序结束)
这个输入ssssa是的回车中的换行符'\n'就被c=getchar();这一句读取并输出了。
总结:
键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到'\n'.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消'\n'的影响,可以用getchar();来清除,这里getchar();只是取得了'\n'但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.再引一篇文章:
http://www.cnblogs.com/biser/archive/2004/09/23/45704.aspx
1.机理
你键盘输入了东西,而此时你又没有用程序去getchar她,请问这个时候你按的键的状态保存在何处?为什么你一会儿去getchar的时候能得到呢
(例子好举,你先做一个1分钟延迟,然后再getchar,会发现一分钟前按的东西会显示出来)
实际上是 输入设备->内存缓冲区->程序getchar
你按的键是放进缓冲区了,然后供程序getchar
你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区.
2.getchar()和getch()
然后就可以给你讲了
getchar是回车以后才进缓冲区
getch是每次都进缓冲区
用你的程序来说(我怎么觉得应该是\n不是/n)
其实你输入computer,没按回车之前, 运行都停止在
getchar()里头,根本没有进入循环,自然也没有运行printf
当你一按回车,才从getchar出来,然后以后因为键盘缓冲区里头有东西,就一个一个字符getchar出来了
想立刻回显,用getch就好了
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1877DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2350k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1547所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2401转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1920mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1609为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1707#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6837两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1555Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1570C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1852一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1584显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1364先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1840使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1779四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1892在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1626线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1760今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4072关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
Windows 刷新输入输出缓冲区 Windows 操作系统中,缓冲区是一种重要的机制,对输入输出操作的效率和正确性产生着重要影响。在 C 语言中,通过使用 setvbuf 函数可以对缓冲区进行设置和刷新,控制缓冲区的行为。 ...
在程序1中,我们可以看到,输入一个数字,然后输入一个字符,但是直接输出了“hello bit”,这是因为在点击回车(‘\n’)时,相当于输入了一个字符,那么我们需要进行清空缓冲区处理。在程序2中,我们使用了fflush...
在这个场景中,我们关注的是“文件输入输出缓冲流”,这是Java或C++等编程语言中常用的概念,用于提高文件读写效率。缓冲流允许我们将数据批量处理,而不是逐字节操作,从而提升了性能。 首先,让我们理解什么是...
### C 语言的输入输出和缓冲区 在深入探讨 C 语言中的输入输出以及缓冲区的概念之前,我们先来理解一下为什么这些概念对于学习 C 语言(而非题目中提到的 C++)非常重要。C 语言作为一种低级别的编程语言,允许...
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。 原理介绍: 当调用输入函数scanf()时,输入函数会将我们输入的数字输入到输入缓冲区, 而当我们的输入缓冲区有内容时,再次输入将不会被...
标准输入缓冲区用于存储从键盘或其他输入源读取的数据,而标准输出缓冲区则用于暂存待打印或写入文件的数据。不设置缓冲区会导致每次用户输入或输出都需要立即处理,这会降低CPU的效率,因为它需要频繁地等待用户的...
实验六的主题是“键盘缓冲区问题”,这在计算机科学领域是一个关键的概念,特别是在操作系统和输入输出(I/O)处理方面。键盘缓冲区是操作系统中一个临时存储区域,用于存放用户在键盘上输入的数据,直到这些数据被...
### C语言输入缓冲区完全攻略 #### 输入缓冲区概述 在C语言中,当用户通过标准输入设备(如键盘)输入数据时,这些数据首先会被暂存于内存的一个特定区域,这一区域通常被称为**键盘输入缓冲区**,简称**输入缓冲...
- 选择输出缓冲区图层的位置和名称,点击"确定"生成缓冲区。 2. **应用缓冲区分析** - 缓冲区创建完成后,将其添加到地图中。你可以调整颜色和透明度,以便更清晰地看到原始数据和缓冲区的关系。 - 使用缓冲区...
在编程领域,尤其是在C语言中,理解和掌握缓冲区(Buffer)的数据输入与输出是至关重要的。缓冲区是一种存储数据的临时区域,它提高了程序处理数据的效率,因为频繁的读写操作可以批量处理,而不是每次单个进行。...
【描述】中提到的主要目的是理解I2S输入输出缓冲区的运作机制。在I2S通信中,音频数据通常会存储在微控制器的内部或外部RAM中,作为输入和输出缓冲区。输入缓冲区用于接收来自音频源(如麦克风)的数据,而输出缓冲...
在经典的词法分析程序设计中,通常会使用定长的输入输出缓冲区,并且程序主体部分会涉及大量的条件跳转。这些设计方式虽然易于理解,但存在明显的缺陷: - **定长缓冲区**:这种方法要求每次读取或写入字符时都要...
- 管理输入输出缓冲区,提供高效的数据传输机制。 - 类似于UNIX中的线路规程(line discipline)0,用于进行标准的字符处理。 - 提供一系列API接口,简化驱动开发过程。 #### 三、串行驱动初始化 - **初始化过程*...
在某些情况下,可能需要调整串口的输入输出缓冲区大小,这时可以使用VISA Set I/O Buffer Size VI来实现。 ##### 8. VISA Flush I/O Buffer 为了清除串口的输入输出缓冲区中的数据,可以使用VISA Flush I/O Buffer ...
1. 数据同步:MediaCodec处理数据是异步的,需要正确管理输入输出缓冲区的状态,防止数据丢失或混乱。 2. 帧率同步:在处理视频时,需要确保输入帧率与输出帧率的一致性,否则可能导致画面跳动或延迟。 3. 错误处理...
缓冲区在提高输入输出效率中起着关键作用,例如,`scanf`和`printf`默认使用缓冲区,而`getchar`和`putchar`则不。此外,有效的错误处理是确保程序健壮性的必要手段,例如,当文件无法打开或读写时应如何优雅地处理...
能学到什么:调用了Qt多线程类库QThread进行实现,并利用了信号量、线程锁等模拟操作系统对临界区资源的访问,输入输出缓冲区的界面可视化 阅读建议:结合代码及相关文档对生产者消费者模型进行理解。
1. **缓冲区管理**:在Linux内核中,驱动程序需要管理设备的输入输出缓冲区,确保数据的正确传输。RSI SDIO驱动可能包含对这些缓冲区的初始化、分配、释放以及填充或清空的操作。 2. **寄存器访问**:驱动程序需要...
在C语言编程中,缓冲区是一种重要的数据结构,主要用于暂时存储数据,以便于更高效地处理输入/输出操作。引入缓冲区的主要目的是为了提高程序执行效率,减少对外部设备(如磁盘、网络等)的访问次数,并且能够更好地...