getchar():
先声明一点:getchar()读到字符的时候返回的是字符的ASCII码。
如果读取失败返回的是EOF--->-1
最核心的要点就是getchar()读取一个字符,只能一次读取一个。
![](https://i-blog.csdnimg.cn/blog_migrate/213aa71221e6797eb7ab3a4c91e74267.png)
putchar()在这里就是输出打印一个字符,了解一下就行了。
我们可以看出就算输入再多的字符读取到的只是第一个数字5
当我们想一直读取打印的时候可以做如下操作:
![](https://i-blog.csdnimg.cn/blog_migrate/b7c35843bf4bc8f9b8bf23be06d3dabc.png)
当我们想让程序结束的时候用ctrl+c就能结束运行
现在我们先来看下面一段代码:
![](https://i-blog.csdnimg.cn/blog_migrate/5033da01bc9000dfa834d9fa92deb0d9.png)
我们输入密码:abc,按下回车会发现程序不给你输入ch的机会,直接执行了条件判断语句,这是为什么呢?
想要理解这里的原理我们要从输入缓冲区的角度来理解:
输入函数并不是直接从键盘上去那数据,而是从输入缓冲区中拿走数据。
![](https://i-blog.csdnimg.cn/blog_migrate/285ed88b8a224ca4b4be8792b176825c.png)
我们输入abc然后按下回车,scanf的机制让他拿走abc,不会拿走‘\n’,但输入缓冲区里面还剩下我们之前按下的回车键‘\n’
![](https://i-blog.csdnimg.cn/blog_migrate/3dde3fe2818140bbffe83eb160097269.png)
此时的getchar()发现输入缓冲区里面还有数据,就不会给你机会让你输入数据,于是getchar()直接拿走输入缓冲区里面剩下的‘\n’
![](https://i-blog.csdnimg.cn/blog_migrate/97c97cd03516474c54f40b3b1128994c.png)
ch得到数据即ch=‘\n’, 然后ch不等于Y,所以程序执行else
那我们如何避免这种情况出现呢?
这个时候我们就要在ch得到正确的数据之前,去清理输入缓冲区里面剩余无用的数据,既然getchar()会拿走里面的数据,那我再用一个getchar()专门拿走缓冲区里面剩下的数据不就好了吗?
![](https://i-blog.csdnimg.cn/blog_migrate/e9d781eafc82e3804442501ccc5d7343.png)
循环中的getchar()一直读取缓冲区里面的数据,直到读到回车即换行符,把它也取出来后,循环结束进行下一个语句,程序可以正常运行了。