getchar(),scanf(),putchar(),gets()函数与输入缓冲区有关知识

getchar()与putchar()

1.这两个函数与scanf与printf类似。

2.getchar()可以用来读取一个字符(你输入的),它的返回值是读取到的那个字符的ASCII码,putchar()输出字符到屏幕上。scanf与printf针对各种类型,而getchar与putchar只针对字符。

3.getchar不需要传入参数,读取失败的时候会返回EOF。那getchar或者scanf到底是怎么从键盘上读取我输入的字符呢?在getchar/scanf与键盘中间有输入缓冲区,从键盘上输入的字符会先到输入缓冲区,然后它们从输入缓冲区中读取字符按下enter,就是往输入缓冲区里面放入了一个换行符(\n)

对于scanf()     就对于换行符与空格有特殊对待

但是像scanf之类的是如果发现键盘缓冲区里有换行符就把换行符前面的东西接收进来,换行符并不接收,还在键盘缓冲区里按下enter,就是往输入缓冲区里面放入了一个换行符(\n)

 

 scanf也不能拿空格,但是尤其注意scanf在读取整数的时候会自动跳过空格。

 

按道理来说,每次循环的时候,输入缓冲区里面最开头都是\n,但每次scanf仍能读取到数字,就是因为scanf在读取整数的时候会自动跳过空格和换行符。 

 

 对于getchar()

1.我们已经知道:getchar不需要传入参数,读取失败的时候会返回EOF那getchar或者scanf到底是怎么从键盘上读取我输入的字符呢?在getchar/scanf与键盘中间有输入缓冲区,从键盘上输入的字符会先到输入缓冲区,然后它们从输入缓冲区中读取字符按下enter,就是往输入缓冲区里面放入了一个换行符(\n)

下面这段话非常关键:

当程序执行时一旦出现getchar,如果此时输入缓冲区里面没有东西,就会弹出一个界面,让你去输入字符(它读取不到就会返回EOF)。如果此时输入缓冲区里面有东西,那么getchar对抓去它干它自己的活。

 

%的ACSII码为37,&的ACSII码为38,*的ACSII码为42,5的ACSII码为37(注意这边肯定是字符5哈),那为什么又莫名其妙会多出来这么一些10呢?是因为我每次按下enter,就是往输入缓冲区里面放入了一个换行符(\n),( \n 的ACSII码为10)

我的那些\n还遗留在输入缓冲区里面, 就被getchar读取到了然后给我返回了一个ACSII码。

因此,getchar()可以用来清理输入缓冲区的,很重要的一个功能,下面这段代码可以用来清理缓存区(因为它读取失败的时候会返回一个EOF)

 注意:getchar()读取的是字符,那么既然是字符肯定是一个一个的,又不是字符串。但当我一下子输入一串东西(此时输入缓冲区就已经有这么一串东西了,并且最后一个是\n),那然后当getchar如果在循环里面的话,它是一个一个字符这么读取并返回ACSII码的,并不是一步到位的。

也可以写一段代码,只打印数字字符

 注:不仅仅只有数字与数字之间可以大小比较,字符与字符之间也可以用大于号与小于号之间比较,比较的依据就是他们的ASCII码。一旦Ctrl+z也会使其直接返回EOF。

也可以写一段代码,只打印非数字字符


我就这么跟你说吧: 一定要弄清楚getchar()与scanf()的底层逻辑,其实就是往输入缓冲区里读东西。 

接下来来一个输入密码的实例:

 

什么原因应该懂了吧,那是因为输入缓冲区里面还有一个\n呢

正确写法是需要来一个getchar 清理缓冲区:

注意:scanf也可以直接输入一个字符串。但是前提是这个字符串不能有空格与\n

char arr[20]={0};
scanf("%s",arr);
scanf("%s",&arr);//两个都可以

gets()函数

在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。该函数的原型为:

# include <stdio.h>
char *gets(char *str);

函数参数:这个函数很简单只有一个参数,参数类型为 char* 型,即参数可以是一个字符指针变量名,也可以是一个字符数组名。

函数功能:gets() 函数的功能是从输入缓冲区中读取一个字符串存储到参数所指向的内存空间或者数组里面。

使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。

  

 

 

 

 


 

 

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絕知此事要躬行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值