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

之前写了个简易的登录程序,但显然这不像写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. Spring的BeanPostProcessor后置处理器与bean的生命周期

    前言 本文将把Spring在Bean的生命周期中涉及到的后置处理器一一梳理出来,并简要说一下功能,至于每个后置处理器在实际扩展中的用处,还要后续慢慢探索总结. 正文 下面一步步跟进探寻那些后置处理器们 ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索

    向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Sou ...

  3. 1091 N-自守数 (15 分)C语言

    如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为"N-自守数".例如 3×92^​2​​ =25392,而 25392 的末尾两位正好是 92,所以 ...

  4. 12款好用的Visual Studio插件,最后一款良心推荐

    目录 01 CodeMaid 02 Markdown Editor 03 ReSharper 04 GitHub Extension for Visual Studio 05 ZenCoding 06 ...

  5. linux入门系列4--vi/vim编辑器

    上一篇文章"linux入门系列3--linux远程登陆工具"讲解了如何使用常用的工具远程连接和管理linux服务器,要管理服务器必然会涉及到脚本文件的创建.编辑工作,因此在介绍命令 ...

  6. String类方法的使用

    String类的判断功能: boolean equals(Object obj)  //比较字符串内容是否相同(区分大小写). boolean equalsIgnoreCase(String str) ...

  7. UGUI源码之Selectable

    Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...

  8. Yolo V3理解bbox和label的关系

    假如一个bbox坐标为:[35 220 62 293 3] 第一步:将bbox转换为中心坐标和宽高形式(3种缩放比例进行缩放) 那么onehot:[0 0 0 1 0 0 0 0 0 0 ...... ...

  9. 使用Java实现简单的Http服务器

    在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar).实现代码如下: 主程序类 package bg.httpserver; import ...

  10. 什么样的项目适合docker部署,docker应用场景

    docker官网上说明了docker的典型场景: 使应用的打包与部署自动化 创建轻量.私密的PAAS环境 实现自动化测试和持续的集成/部署 根据这些特性,我们可以想象一下,如果你的项目有如下痛点或者需 ...