C语言遇到的关于清除标准输入缓冲区的问题[编程入门]
关于标准输入缓冲区的一个易犯的小错误
之前写了个简易的登录程序,但显然这不像写Java时那么容易(只要思路对,基本没问题)。一不留神就出现了小BUG!
以下是错误的源代码:
#include <stdio.h>
#include <string.h>
/*
*作者:SeaFever
*功能:实现用户登录模拟
*开始创作:2020.2.3
*结束创作:
*/
int main()
{
char user[] = {"FAFA"},password[] = {"740151334"},aUser[4],aPassword[9];
// 读取用户名
int i,j;
printf("%s\n", "User:");
for (i=0;i<4;i++ ) {
if ((aUser[i] = getchar()) != '\n' ) {
} else {
break;
}
}
// 读取用户密码
printf("%s\n", "Password:");
for (j=0;j<9;j++ ) {
if ((aPassword[j] = getchar()) != '\n' ){
} else {
break;
}
}
// 判断用户名是否存在 -(true)-> 判断密码是否正确
if (strcmp(user, aUser) == 0 ) {
if (strcmp(password, aPassword) == 0 ) {
printf("%s\n", "Successful!O(∩_∩)O");
goto end;
}
}
printf("%s\n", "Failed!");
end:return 0;
}
本以为一切都设计的很不错,步步到位!但经过几次的编译运行,我都不能找到问题的所在!感觉设计的没问题啊o(TヘTo)!
于是,我开启了那神圣的“调试”功能,把每一个变量都放入到检测环境中去:

然后我们观察每一步的“每个变量”值得变化!
于是,我发现在第二次输入密码数据时,也就是数组 aPassword[0] 的第一个字符并不是期望的数字,而是一个 “\n”。


看来问题显而易见了!
第二次输入密码数据时,由于前面存在的 “\n” 未被清理掉,而导致 数组aPassword 无法读取到需要的的数据!
那么,我们在读取密码之前插入 fflush(stdin); 命令即可刷新标准输入缓冲区。
正确代码如下:
#include <stdio.h>
#include <string.h>
/*
*作者:SeaFever
*功能:实现用户登录模拟
*开始创作:2020.2.3
*结束创作:2020.2.4
*/
int main()
{
char user[] = {"FAFA"},password[] = {"740151334"},aUser[4],aPassword[9];
// 读取用户名
int i,j;
printf("%s\n", "User:");
for (i=0;i<4;i++ ) {
if ((aUser[i] = getchar()) != '\n' ) {
} else {
break;
}
}
fflush(stdin); //刷新标准输入缓冲区
// 读取用户密码
printf("%s\n", "Password:");
for (j=0;j<9;j++ ) {
if ((aPassword[j] = getchar()) != '\n' ){
} else {
break;
}
}
// 判断用户名是否存在 -(true)-> 判断密码是否正确
if (strcmp(user, aUser) == 0 ) {
if (strcmp(password, aPassword) == 0 ) {
printf("%s\n", "Successful!O(∩_∩)O");
goto end;
}
}
printf("%s\n", "Failed!");
end:return 0;
}
运行结果如下:
- 登录成功

- 登陆失败

QQ群:1035426849
欢迎小白、大佬的加入(@^0^@)/
C语言遇到的关于清除标准输入缓冲区的问题[编程入门]的更多相关文章
- 在C / C ++中清除输入缓冲区
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- c++清除输入缓冲区之 sync() vs ignore()
最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...
- Mysql C语言API编程入门讲解
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
- C语言编程入门之--第四章C语言基本数据类型
导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...
- 快乐编程大本营【java语言训练班】第5课: java的数组编程
快乐编程大本营[java语言训练班]第5课: java的数组编程 第1节. 声明数组变量 第2节. 创建数组对象 第3节. 访问数组元素 第4节. 修改数组元素 第5节. 多维数组 学习地址如下:ht ...
- 编程入门选什么语言好?C 语言还是Python ?为你解析
前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...
- scanf()中清除输入缓冲区的几种方法归纳
应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...
- php sleep()的实时输出打印,清除ob缓冲区
@ini_set('implicit_flush',1);ob_implicit_flush(1);@ob_end_clean(); echo 1;//echo str_repeat('', 1024 ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
随机推荐
- $CF888E\ Maximum\ Subsequence$ 搜索
正解:$meet\ in\ the\ middle$ 解题报告: 传送门$QwQ$. 发现数据范围为$n\leq 35$,所以$2^{\frac{n}{2}}$是可做的. 所以先拆成$A,B$两个集合 ...
- $Luogu2680/NOIp2015$ 运输计划
传送门 $Sol$ 最暴力的做法就是枚举最长链上的边,然后再算一次所有的链长,更新$ans$. 这里要求最大的最小,容易想到二分答案.对于二分的值$mid$,扫一遍所有的链,若链长小于等于$mid$, ...
- 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举
题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
- 学习集合Collection_通用方法
Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 pu ...
- leetcode腾讯精选练习之两数相加
两数相加 题目: 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们 ...
- 【Java基础总结】GUI
GUI(Graphical User Interface),图形用户接口 CLI(Command Line User Interface),命令行用户接口 1. 容器 Container GUI主要位 ...
- 【转】Java 正则表达式详解
正则表达式30分钟入门教程 常用正则表达式 如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单. 如果你不熟悉这个术语,那么“正则表达式”(R ...
- Sql Server执行一条Update语句很慢,插入数据失败
今天同事要我修改服务器数据库里面的2条数据,查看服务器上的SQL Server数据库的时候,发现这几天数据没有添加成功,然后发现磁盘很快就满了,执行Update语句时,执行半天都提示还在执行,查询语句 ...
- LR Java脚本编写方法
之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...