java 清除stdin缓冲区_C语言遇到的关于清除标准输入缓冲区的问题[编程入门]

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

之前写了个简易的登录程序,但显然这不像写Java时那么容易(只要思路对,基本没问题)。一不留神就出现了小BUG!

以下是错误的源代码:

#include

#include

/*

*作者: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.png?raw=true

然后我们观察每一步的“每个变量”值得变化!

于是,我发现在第二次输入密码数据时,也就是数组 aPassword[0] 的第一个字符并不是期望的数字,而是一个 “\n”。

2.png?raw=true

3.png?raw=true

看来问题显而易见了!

第二次输入密码数据时,由于前面存在的 “\n” 未被清理掉,而导致 数组aPassword 无法读取到需要的的数据!

那么,我们在读取密码之前插入 fflush(stdin); 命令即可刷新标准输入缓冲区。

正确代码如下:

#include

#include

/*

*作者: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.png?raw=true

登陆失败

5.png?raw=true

QQ群:1035426849

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值