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)!
于是,我开启了那神圣的“调试”功能,把每一个变量都放入到检测环境中去:
图1 检测变量
然后我们观察每一步的“每个变量”值得变化!

于是,我发现在第二次输入密码数据时,也就是数组 aPassword[0] 的第一个字符并不是期望的数字,而是一个 “\n”。
图2 读取前
图3 读取后
看来问题显而易见了!
第二次输入密码数据时,由于前面存在的 “\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;
}

运行结果如下:

  • 登录成功
    图4 登录成功
  • 登陆失败
    图5 登录失败
QQ群:1035426849

欢迎小白、大佬的加入(@^0^@)/

猜你喜欢

转载自www.cnblogs.com/seafever/p/12262257.html