C语言中使用while循环清理缓冲区

代码分析:

为什么这里我们还没有输入字符但是程序就已经读取到字符并且已经执行完毕了呢?

首先我们要了解scanf和getchar的工作原理:scanf和getchar并不是直接去键盘上读取数据和字符,而是在他们和键盘之间有一个缓冲区,scanf和getchar都会去缓冲区读取。

首先进行读取的是scanf,它会将123456全部读取放到整型数组password中,然后getchar会进行读取操作,在我们输入完密码时要按回车键来让scanf确认密码输入完成,但是这个回车键也就是 '\n' 字符并不会被scanf读取,而是放到了缓冲区中;当getchar进行读取时缓冲区中这时候只有 '\n' 这个字符,那么getchar就会把这个字符读走。这样的话程序就执行完毕了,显然 '\n' 不是字符 'Y',所以会打印输出“确认失败”。

那么我们怎么解决这个问题呢?

现在一直在干扰我们的就是缓冲区中没有被scanf读取的字符 '\n' ,这个字符影响了我们的下一步输入和读取和输入操作,那么我们只要清理了这个字符是不是程序就可以正常执行了。我们可以在读取字符操作前面再加一个读取字符操作将这个字符 '\n'取走。

 

 这样程序就能按照我们所设想的那样来执行了,但是如果我们的密码中有也存在字符那么这个操作是否就会失效呢?

 

当我们的密码是复杂密码是(可能包含空格字符等),显然问题并不是多了一个换行符那么简单了。那么现在我们应该怎么实现我们想要的功能呢?

 

 我们可以使用while循环语句来进行清理缓冲区中多个字符的操作,我们先定义一个整形变量tmp用来存放读取的多余字符,当我们从缓冲区读取到的字符不是换行符  '\n'  时,程序不进行任何操作,然后再次进入循环;当我们读取到的字符为换行符 '\n' ,这时他已经被读取走了,不在缓冲区中了,这时的缓冲区是没有任何字符的,我们就可以进行下面的读取字符确认密码的操作了。

 使用while循环清理缓冲区的原理就是这样,但是这里只是描述了一下原理,实际应用中不会出现像这种只能是数字密码的,这里只是说明while循环的一种应用。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值