C语言getchar,putchar和缓冲区详解

getchar

getchar的概念
  1. 返回类型
    在这里插入图片描述
    如图片的标记部分,getchar返回的是一个整型(字符的ascii码),比如在这里插入图片描述
    getchar取得了字符a,并将a转换为ascii码(97)。

  2. getchar返回值
    在这里插入图片描述

图片中画线的大致意思就是(自己翻译的,大致意思是这样)

这些函数(getchar)都会返回指定的字符来阅读,如果输入错误的字符的话,getchar就会返回EOF.

getchar的使用

顾名思义,getchar就是在键盘上取得一个字符, 如图在这里插入图片描述
getchar取得一个字符存入整形变量c中(putchar下面再解释)

putchar

putchar介绍

putchar就是输出一个字符,如果是输出整形变量的话,那么就换转换为对应的ascci码,比如
在这里插入图片描述

97就转换成了字符a

所以上面的图片的执行过程就是(从这往上数第二个图片),getchar从键盘取得一个字符a,并把字符a转换为ascii码并存入整型变量c中,然后putchar就将97又转换为字符a,最后再屏幕上打印出来。

缓冲区(重点!!!)

用例子来解释,比如设定一个程序,用户输入密码,然后通过再次输入Y或者N来确认用户是否确认密码。在这里插入图片描述
看起来这个程序是没有一点问题的,没有语法错误也没有逻辑上的矛盾,但是结果就是不对,还没有输入Y或者N就程序结束,直接判断"密码确认失败",原因如下

scanf和getchar是从缓冲区里面获取字符(数字)的,程序一开始缓冲区里面是没有任何东西的,然后scanf就等待用户输入数字(比如是123456),当输入完数字后就会用一个回车(’\n’)来结束scanf,但在缓冲区里面存放的是’123456\0’,这时候scanf读完123456后遇到\0后,就会截止,读取\0前面的数字(字符)。但是缓冲区里面还有\0,然后getchar就会从缓冲区中取得’\0’,然后存入整型变量c中,然后进行if判断,发现两者’Y !=ch’所以输出’密码确认失败’(附上一个图片)在这里插入图片描述
变成了在这里插入图片描述

那么如何解决?

我只需要将’\n’去掉就可以了,所以,我在scanf之后加了一个getchar,就可以把’\n’去掉在这里插入图片描述
但是这有一个缺陷,如果我输入的密码是’123456 abcdef’(密码中间有一个空格),那么程序运行就会是这样在这里插入图片描述
scanf读取空格之前的数(字符),后面的’abcdef’没有读到,导致程序运行结果不合理在这里插入图片描述
这时候,两个getchar就会取得一个空格,一个a,导致程序结果不合理。在这里插入图片描述

所以这种方法遇到有空格就不行了,那么方法二如下:

只用加上这个就可以了

	int tep = 0;
	while(tep = getchar() != '\n'){
	;
	}

在这里插入图片描述
getchar从缓冲区取得字符,直到读到’\n’再结束
当然,这个代码是有漏洞的,比如password只存入了13(以上面的代码为例),而对空格之后的数字没有存入,我只是简单的介绍一下如何解决还没有确认密码就直接输出“密码确认失败”,不要较真啊。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值