首先了解 getchar() putchar() scanf()
getchar()的作用是读取一个字符,同时返回值为对应字符的ASCII值,若读取失败返回值为EOF;
注:getchar()在使用时不用给参数
putchar()是打印所给数字对应的ASCII字符;
注:putchar()在使用时一定要给参数
scanf()的读取是遇到空格和'\n'终止,简单来说就是只读取空格和'\n'之前的内容;
对于上述代码为什么输入一个A按回车后光标会跑到下一行呢?
这就引入了输入缓冲区这个概念;其实getchar()每次拿字符是从输入缓冲区中拿的,并且一次只能拿一个字符。
刚开始输入缓冲区里什么也没有,然后在键盘上输入A再按回车,此时输入缓冲区里就有了两个字符,分别是'A'和'\n'。(注:这里的\n是提示getchar()已经输入完毕) 而getchar()只将字符'A'拿走,放到ch里,判断打印ch,然后while循环中getchar()再一次将输入缓冲区里的'\n'拿走,判断打印'\n',所以就用了上述情况。
getchar() | 输入缓冲区 | 键盘 |
'A' '\n'
为什么要了解输入缓冲区
在此背景输入密码'123456'后,系统直接输出'确认失败',并没有给机会在屏幕上输入'Y'或'N'。因为此时输入缓冲区里有'123456\n'这些字符,而scanf()只拿走了'123456',(注:'\n'是提示scanf()输入完毕,继续执行代码) 放到password中,而getchar()将输入缓冲区中剩余的'\n'取走了,直接进行了if判断,所以没有给机会输入。
上述代码中多加入了一个getchar(),它的作用是清理缓冲区 ,就是将上次遗留的'\n'清除,此时输入缓冲区里就为空了,遇到第二个getchar()就需要进行输入。
加深理解
上面说过scanf()的读取是遇到空格和'\n'终止,上诉代码中scanf()只将'123456'放到password中,而此时输入缓冲区中就不止一个字符,所以用一个getchar()去清理缓冲区显然是不行的。
上述代码利用while循环进行缓冲区清除可以很好的解决这一问题。