C程序中的缓冲输入设计

发布者:心语如画最新更新时间:2018-01-03 来源: eefocus关键字:C程序  缓冲输入 手机看文章 扫描二维码
随时随地手机看文章

缓冲输入,很早之前就听说过这个概念,一直不怎么理解。后来,一听到缓冲,脑子就昏沉沉的。其实,缓冲输入也没啥大不了的,只要有打破砂锅想到底的精神,就能扫除以前所有的似是而非。

缓冲输入(buffered input ),就是说输入时键入的一系列字符不是直接发给程序,而是被存放在一个叫做缓冲区的临时存储单元里。也就是说,这些字符以序列(sequence)的形式暂存于缓冲区,然后等程序一个一个地取(fetch one by one)。

那么,这些字符是怎样进入缓冲区的呢?通过enter键。不过别忘了,enter建也是一个字符,所以,缓冲区里的字符串总是应该以enter键结束的。(当然,还有另外一种情况,键盘缓冲区是有空间限制的,填满之后不用enter键也会直接推送到输入流缓冲区内。输入设备除了键盘之外,磁盘、光盘、扫描仪等凡是能向计算机内存输入数据的都是输入设备.)

出于移植性方面的考虑,C语言本身不提供输入输出语句,IO操作都是由函数来实现,这些常用的通用函数,以函数库的形式存放在系统中。C函数库与C编译系统分开设计,不同的函数库针对不同类型的计算机编写,已经被编译为目标文件(.obj)。如果在源程序中有库函数,在编译时并不把它翻译成目标指令,而是在执行的连接阶段与由源程序编译而得到的目标文件进行连接,生成可执行的目标程序。

C语言函数库中的标准输入输出函数有:putchar(输出字符);输入字符getchar();格式输出printf(输出格式,变量列表);格式输入sCANf(输出格式,地址列表);输出字符串puts(字符数组名,或者字符串指针);输入字符串gets(字符数组名,或者字符串指针)。

在getchar(),scanf("%c"),gets()面前,所以字符一律平等,不管是数字、字母还是空格、Tab、回车,都会原封不动地输入。回车键起的作用就是结束本轮输入,把输入的序列推入缓冲区,让这些输入命名按照各自的功能输入。用这几个命令的时候,一定要小心前面缓冲区的剩余字符。

而对于scanf(“%s”),起始空白字符跳过,后来碰到空白字符就视为结束,最后自动加上空字符\0。其与gets()的区别在于:%s会以任何的空字符结束,而gets是回车结束。另外,%s,s前可以加数字,表示只读多少个。在输入的字符串中包含空格时,应该使用gets输入。???????

对于scanf(“%d”),就只认数字了。可以以空格或者正负号(%u就不能有正负号)开头,可是决不能以字母开头。非数字,包括小数点都为结束标志。

对于scanf(“%f”),基本与%d相同,但是除了认数字,还认小数点和指数e。

PS1:scanf(“%[]”)

ANSI C 标准向 scanf() 增加了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,以下的扫描集使 scanf() 读入字符 A、B 和 C:
%[ABC]
使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。
对于许多实现来说,用连字符可以说明一个范围。 例如,以下扫描集使 scanf() 接受字母 A 到 Z:
%[A-Z]
重要的是要注意扫描集是区分大小写的。因此,希望扫描大、小写字符时,应该分别说明大、小写字母。
对于%[]还可以用^+任意字符(包括eof)来结束字符串的输入。比如%[^EOF]就是直到有EOF输入,字符串才中止。
但一定要记住就是c语言是缓冲输入,即使你%[^a],再你输入回车之前输入多少的a都是不可能结束的。


PS2:scanf的标准形式

int scanf(char *format,...);
这应该是scanf的标准形式。先说说关于他的返回值的问题。
库函数几乎都是有返回值的,有些人可能很奇怪,怎么很少人用过scanf的返回值呢?
scanf会返回成功接收到的变量数量的值。比如scanf("%d",&j"),与scanf("%d=",&j),如果接受成功的话返回值都是1
我用如下语句作了测试
#include
int main (){
     int j;
     printf ("%d",scanf("%d\n",&j));
     return 0;
}
如果你开始就输入回车,程序会继续等待你输入,因为在输入数字的时候,scanf会跳过空白字符。(the c programming language 上说,scanf实际上是用getchar()接受由数字组成的字符串,再转换成数字)
如果我输入CTRl-z(unix上是ctrl-d)则会返回-1(随编译器而定).这实际上就是常量EOF的值,也就是所谓的返回eof
如果我键入的不是数字返回值就是0。但是如果我输入浮点数,又会怎么样呢?
我举的例子中同样会返回1,但是缓冲区会留下垃圾,如果是scanf("%d%d",&a,&b);则会出错。
这是可以使用一个库函数fflush(stdin)来清除缓冲。不过貌似雨中飞燕大姐说这个用法是非标准的。K&R,只是说行为没有定义,但我们可以使用while((c=getchar())!='\n'&&c!=EOF);


关键字:C程序  缓冲输入 引用地址:C程序中的缓冲输入设计

上一篇:C51学习心得体会,函数的传引用调用和传值调用方法
下一篇:C51程序设计中的运算符应用

推荐阅读最新更新时间:2024-03-16 15:51

atmega8535 Ad转换的c程序
atmega8535 Ad转换的c程序 #include io8535v.h #define uchar unsigned char #define uint unsigned int uchar Table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Data ={0,0,0,0}; void DelayMs(uint i) //0.25ms {uchar j; for(;i!=0;i--) {for(j=250;j!=0;j--) {;}} } void Display(uchar *p) //间隔5ms显示 {uchar i,sel=0x
[单片机]
8051单片机抢答器C程序
#include REG51.h /****************************************************************** * 自定义Macro *******************************************************************/ //编码的均为反向编码 #define CLEAR 0x7f //定义清空的反码 #define LED_BEGIN 0x01 // 定义开始时数码管的显示 #define LED_FOUL 0x38 // 犯规后显示字母 F ,数码管编码 #define LED_
[单片机]
1~99秒倒计时数码管显示C程序+Proteus仿真
1~99秒倒计时数码管显示C程序+Proteus仿真文件。 优化了程序,使用51单片机内部定时器,可以实现1-99秒内倒计时。 仿真效果为: 源程序为: /* 调试环境:Proteus 7.8 AT89S52单片机 8位共阴数码管 功能为:实现数码管1秒~99秒倒计时, 12M晶振 */ #include reg52.h #define uchar unsigned char sbit LED1=P1^1; //连的是LED1 #define MAX_NUM 13 //最大倒计时数1~99可设 #define SEGPORT P0 //定义数码管连接端口 sbi
[单片机]
1~99秒倒计时数码管显示<font color='red'>C程序</font>+Proteus仿真
PLC调试再续——PLC程序现场调试
PLC程序现场调试指在工业现场,甩有设备都安装好后,所有连接线都接好后的实际调试。也是PLC程序的最后调试。    现场调试的目的是,调试通过后,可交给用户使用,或试运行。    现场调试参与的人员较多,要组织好,要有调试大纲。依大纲,按部就班地一步步推进。开始调试时,设备可先不运转,甚至了不要带电。可随着调试的进展逐步加电、开机、加载,直到按额定条件运转。具体过程大体是: 1)、要查接线、核对地址。要逐点进行,要确保正确无误。    可不带电核对,那就是查线,较麻烦。也可带电查,加上信号后,看电控系统的动作情况是否符合设计的目的。 2)、检查模拟量输入输出。    看输入输出模块是否正确,工作是否正
[嵌入式]
如何衡量PLC程序的编写质量
写PLC程序的各位都是高手 因为需要懂得套路,也是思路,就平时常见的程序基本看过两种套路。 1、输出点用线圈输出,输出在程序里只有一处。 2、输出点直接用set和rst控制,一个输出点在程序里多处出现。 用什么套路,各自优缺点是什么? 网友A 我倾向第二种,第一种手自动切换有点麻烦增加程序步数,如碰到单控电磁阀,自动将气缸置位了。 这时切换到手动,手动控制该气缸时还得去吧自动那个状态复位掉。 网友B 一般用M点控制线圈,程序里面控制一个线圈的可以是多个M点,就不会出现多线圈,和第一种差不多了 。 网友C 我倾向第二种,第一转来转去的麻烦 网友D 思路一,一个输出就是一套逻辑,是这个输出点什么时候开,什么时候关,报警,复位,急停
[嵌入式]
如何衡量PL<font color='red'>C程序</font>的编写质量
PLC程序调试步骤
人的脑力是有限的,并且记事情也有时间性。过了N天就会忘记每次修改的原因,为什么要加这条指令,为什么要删除这个网络,让自己以后看自己以前编写的程序时都会很困惑。做到以下步骤,对所有程序理解与修改会有很大帮助的。 1、 把原有程序另存一个, 在另存的程序上作修改。文件命名一个主要的程序名称,标注第几次修改,并加上修改的日期,最好是在文件名外加上简要的修改标题。例如: 《 捆扎程序5(06.10.23翻板步进电机加条件) 》 2、 用.doc文件记录修改的年月日。 3、 在日期下面记录修改程序的步骤,增加或是删除了哪些指令等。并在程序的编辑条注释中做记录,以备下次修改。 4、 在.doc文件中详细记录修改程序的原因,所出现的故障现象是什么
[嵌入式]
AVR_GCC程序设计基础
1.在avr studio的project options(工程选项里面)在General选项里面需要注意的是: edit configuratio:这个选项的意思是当前项目的默认输出文件夹是default,而且这个文件夹的名称是可以改的 Device:是我们要选择工作的芯片 Frequency:是芯片的工作频率 Optimizatio:是程序编译时优化的级别主要是优化程序输出可执行文件的大小 unsigned char(-funsigned char):默认程序中的char类型为是无符号类型 其他的设置都基本上是默认的设置。 2.makfile 在使用avr_gcc的编译器是,makfile是必不可少,如果你是默认的话
[单片机]
AVR_GC<font color='red'>C程序</font>设计基础
51单片机+点阵8*8上、下、左、右移显示C程序
最近在研究点阵,这东西看起来简单,但是要完全掌握它,可是要花一定时间的!我现在做得8*8点阵硬件电路是这样的,行采用74HC138+三极管8550驱动,列采用74HC595驱动,这种电路是非常用的,其次的扫描原理就是,先打开第一行,然后送代码给列,即595端,像这样扫描8次行,一个字就完成了,具体原理图如下图: 下面我将我写得代码下载地址分享下: http://www.51hei.com/f/sxzy.rar 一、上移: #include reg52.h #define uchar unsigned char #define uint unsigned int #define LINE P1//定义行线IO口,即74H
[单片机]
51单片机+点阵8*8上、下、左、右移显示<font color='red'>C程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved