关于scanf,getchar,和gets对缓存区的操作

  在学习C语言时,我们经常要使用Char 和 Char[] 来存储字符和字符串。然而,在读取数据时,scanf、get和gets对缓存区的操作和读取结果会影响我们数据输入的结果。这次博客主要解释空格和回车对不同读取函数的影响。

写在前面:

  1. 只有在调用读取类函数且缓存区空了的情况下,才会让用户输入。换言之,即使读取和输出类函数交错调用,只要用户第一次输入的数据足够"多",那么这个程序将自动按照顺序执行各个函数。但是用户的视角来看,会出现全体输入类函数先执行,然后再执行输出类函数的错觉
  2. 各个读取类函数的结束判断标志和允许读入的数据可能会有不同,这将导致一些差异。
  3. 若只考虑用户使用回车键换行,则缓存区至多只有一个换行且在末尾。
  4. 敲击回车的两个意义:1.在缓冲区末尾添加一个换行符(\n,ASCII码10)2.用户结束本次输入操作,程序继续执行,直到下一次缓存区为空。
  5. 敲击空格的意义:在缓冲区添加一个空格符(ASCII码13)

 

对字符的输入

getchar 和 scanf("%c",char*)

使用格式:

char c;

c=getchar();

scanf("%c",&c);

 

除了使用格式不同以外,在读取方面基本一致。

判断结束的标志:换行

要点:1.会将换行空格读走;

           2.在执行时时,如果缓存区有字符存在,则直接读入,哪怕是换行符;

           3.如果直接调用getchar()但不进行赋值,可以从缓存区中取出一个字符,但是只能”抛弃“。(这个后面有用)

            

         总结:两位不挑食,拿了就走;如果缓存区空了,就请用户输入一些,然后依然是拿了就走。

-

 

对字符串的输入

gets(char*)和scanf(”%s“,char*)

使用格式

char s[n];//n需要为正整数数

scanf(”%s“,s);

gets(s);

判断结束的标志:

gets():以换行为结束标志,空格也会被读进来。

scanf():以换行空格为结束标志,空格不会被读进来。

两者都不会读换行。

要点:

  1. 两者都不会将换行读入,且对缓存区操作有区别。
  2. scanf若遇到空格或换行,则会结束本次读取。如果未能读到字符串,则会将这个空格或换行剔出缓存区,并进行下一次尝试,直到读到字符串。
  3. scanf在用于其他类型的数据时,表现也会类似第二条。
  4. scanf读到字符串(数据),遇到换行或空格后就结束,不会将其剔出,这个会干扰后面调用的字符读取和gets()。
  5. gets()如果遇到换行就会停止,并将这个换行给剔出,且不在尝试读取字符串。
  6. 如果之前使用过scanf()进行各种类型的数据读取,如果要避免残留的空格和换行符对gets()和字符读取的干扰,可以考虑调用一次gets()清空缓存区,如果对用户的输入方式放心的话,可以调用getchar()。

记忆:scanf会一直坚持直到到拿到字符串,在那之前的空格和换行会被剔出,拿到后就不再剔出空格和换行。

         gets只会拿一次,且接受空格。遇到换行符时会把它剔出,即使未能取到字符串,也会将遇到的换行符剔出并结束。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值