关于标准输入缓冲区的一个易犯的小错误

之前写了个简易的登录程序,但显然这不像写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语言遇到的关于清除标准输入缓冲区的问题[编程入门]的更多相关文章

  1. 在C / C ++中清除输入缓冲区

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  2. c++清除输入缓冲区之 sync() vs ignore()

    最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...

  3. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

  4. C语言编程入门之--第四章C语言基本数据类型

      导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型.数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了.本章从二进制的基本概念开始,然 ...

  5. 快乐编程大本营【java语言训练班】第5课: java的数组编程

    快乐编程大本营[java语言训练班]第5课: java的数组编程 第1节. 声明数组变量 第2节. 创建数组对象 第3节. 访问数组元素 第4节. 修改数组元素 第5节. 多维数组 学习地址如下:ht ...

  6. 编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

  7. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  8. php sleep()的实时输出打印,清除ob缓冲区

    @ini_set('implicit_flush',1);ob_implicit_flush(1);@ob_end_clean(); echo 1;//echo str_repeat('', 1024 ...

  9. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

随机推荐

  1. 小白学 Python 爬虫(34):爬虫框架 Scrapy 入门基础(二)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. 一个.NET程序员 "2019" 跳槽3次的悲惨故事

    2019年是值得深思的一年,在找工作上没有那么用心,导致碌碌无为,在这里我建议大家找工作的时候不要太着急...要不然会被逼疯的,一定不能被“工作”挑,一定要做到挑"工作".:那我就 ...

  3. Scala与Mongodb实践2-----图片、日期的存储读取

    目的:在IDEA中实现图片.日期等相关的类型在mongodb存储读取 主要是Scala和mongodb里面的类型的转换.Scala里面的数据编码类型和mongodb里面的存储的数据类型各个不同.存在类 ...

  4. 基于 HTML5 WebGL 构建 3D 智能数字化城市全景

    前言 自 2011 年我国城镇化率首次突破 50% 以来,<新型城镇化发展规划>将智慧城市列为我国城市发展的三大目标之一,并提出到 2020 年,建成一批特色鲜明的智慧城市.截至现今,全国 ...

  5. Spring Boot2 系列教程 (三) | 使用 LomBok 提高开发效率

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 上周去了开年会,去的地方是温泉度假村.老实说,我是无感的,90% 是因为没中奖(老板太抠,两百人只抽三个奖),10 ...

  6. RocketMQ客户端加载流程

     这节介绍RocketMQ客户端的启动流程,即Consumer和Producer的启动流程. 1. 客户端demo  首先先看下客户端的demo Producer: public class Sync ...

  7. java架构之路(多线程)JUC并发编程之Semaphore信号量、CountDownLatch、CyclicBarrier栅栏、Executors线程池

    上期回顾: 上次博客我们主要说了我们juc并发包下面的ReetrantLock的一些简单使用和底层的原理,是如何实现公平锁.非公平锁的.内部的双向链表到底是什么意思,prev和next到底是什么,为什 ...

  8. 洛谷P3645 [APIO2015]雅加达的摩天楼

    题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N − 1.除了这 NN 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神 ...

  9. [bzoj3529] [洛谷P3312] [Sdoi2014] 数表

    Description 有一张n×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  10. Processing 3!

    Welcome to Processing 3! Dan explains the new features and changes; the links Dan mentions are on th ...