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程序设计入门--消息管理 ...
随机推荐
- Spring的BeanPostProcessor后置处理器与bean的生命周期
前言 本文将把Spring在Bean的生命周期中涉及到的后置处理器一一梳理出来,并简要说一下功能,至于每个后置处理器在实际扩展中的用处,还要后续慢慢探索总结. 正文 下面一步步跟进探寻那些后置处理器们 ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索
向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Sou ...
- 1091 N-自守数 (15 分)C语言
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为"N-自守数".例如 3×92^2 =25392,而 25392 的末尾两位正好是 92,所以 ...
- 12款好用的Visual Studio插件,最后一款良心推荐
目录 01 CodeMaid 02 Markdown Editor 03 ReSharper 04 GitHub Extension for Visual Studio 05 ZenCoding 06 ...
- linux入门系列4--vi/vim编辑器
上一篇文章"linux入门系列3--linux远程登陆工具"讲解了如何使用常用的工具远程连接和管理linux服务器,要管理服务器必然会涉及到脚本文件的创建.编辑工作,因此在介绍命令 ...
- String类方法的使用
String类的判断功能: boolean equals(Object obj) //比较字符串内容是否相同(区分大小写). boolean equalsIgnoreCase(String str) ...
- UGUI源码之Selectable
Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...
- Yolo V3理解bbox和label的关系
假如一个bbox坐标为:[35 220 62 293 3] 第一步:将bbox转换为中心坐标和宽高形式(3种缩放比例进行缩放) 那么onehot:[0 0 0 1 0 0 0 0 0 0 ...... ...
- 使用Java实现简单的Http服务器
在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar).实现代码如下: 主程序类 package bg.httpserver; import ...
- 什么样的项目适合docker部署,docker应用场景
docker官网上说明了docker的典型场景: 使应用的打包与部署自动化 创建轻量.私密的PAAS环境 实现自动化测试和持续的集成/部署 根据这些特性,我们可以想象一下,如果你的项目有如下痛点或者需 ...