当前位置:首页 > 单片机 > 单片机
[导读] 缓冲输入,很早之前就听说过这个概念,一直不怎么理解。后来,一听到缓冲,脑子就昏沉沉的。其实,缓冲输入也没啥大不了的,只要有打破砂锅想到底的精神,就能扫除以前所有的似是而非。缓冲输入(buffe

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

缓冲输入(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”),起始空白字符跳过,后来碰到空白字符就视为结束,最后自动加上空字符。其与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("%dn",&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);


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在这篇文章中,小编将对PLC的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: PLC 模块化 程序

对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一。一般是优化了代码的尺寸,就会带来执行时间的增加;如果优化了程序的执行速度,通常会带来代码增加的副作用。很难鱼与熊掌兼得,只能在...

关键字: 单片机 程序

一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,必须选择合适的算法和数据结构。

关键字: CPU 程序 缓存

仿真的概念其实使用非常广,最终的含义就是使用可控的手段来模仿真实的情况。在嵌入式系统的设计中,仿真应用的范围主要集中在对程序的仿真上。

关键字: 单片机 仿真器 程序

步进电动机是将电脉冲激励信号转换成相应的角位移或线位移的离散值控制电动机,这种电动机每当输入一个电脉冲就动一步,所以又称脉冲电动机。

关键字: 步进电机 正反转 程序

KeilμVision4是Keil软件公司为8051系列微控制器及其兼容产品设计的集成式软件开发环境。μVision4集成了C51编译器和A51汇编器,其界面类似于Microsoft VS,支持C语言和汇编语言程序的编写...

关键字: 程序 编译 链接

双方各执一词,谁也不退让,吴雄昂的身份成为薛定谔的猫:在Arm公司眼中,他已经被罢免一切职位;在安谋中国声明里,吴仍然一切照常。这种叠加态或许还会持续一段时间,但叠加态应该很快就会塌缩成一个确定结果。同样,安谋中国董事会...

关键字: ARM 中国董事会 程序

除了指令空间,自定义指令对应的程序出入口也有严格限制。自定义指令在使用过程中出现任何错误时,Arm的工具链都能及时对其进行识别、提取,并且进行相应的控制。目前也已经有第三方编译器,可以识别自定义指令集可能会出现的错误。专...

关键字: 指令空间 程序 ARM

如果说一众美国科技公司遵循特朗普命令断供华为,还算某种程度上维护所谓程序正义不得已而为之;那么各路本应对政治保持中立的国际技术标准组织,先后宣布剔除华为成员资格,绝对算助纣为虐;而联邦快递将华为委托寄送目的地为中国的快递...

关键字: 快递 华为 程序

在软件开发过程中,我们希望软件可以运行无误。但是常常事与愿违,程序经常跑飞,或者卡死。原因有很多,有可能是因为软件系统设计的原因,或者外部传感器的失效,再或者是程序的Bug等。为了防止程序在出现问题之后,可以顺利复位和重...

关键字: 软件 程序 传感器
关闭