今天日常看题目,发现一个问题,就是scanf缓冲区问题
直接看代码
注意这行代码
printf("请输入账号:\n");
scanf_s("%s", myAdmin,50); // 限制账号名的长度
#include<stdio.h>
#include<string.h>
int main() {
char admin[] = "administor"; // 修改账号的声明
int password = 123456;
int chance = 3;
int myPassword;
for (int i = 1; i <= chance; i++) {
char myAdmin[50];
printf("请输入账号:\n");
scanf_s("%s", myAdmin,50); // 限制账号名的长度
printf("请输入密码:\n");
scanf_s("%d", &myPassword);
if (strcmp(myAdmin, admin) == 0 && password == myPassword) {
printf("OK ENTER!\n");
break;
}
else if (strcmp(myAdmin, admin) != 0) {
printf("账号不存在!\n");
}
else {
printf("密码错误!\n");
}
// 清空输入流
// rewind(stdin);
printf("你还有%d次机会\n", chance - i);
}
printf("结束!\n"); // 结束消息放在循环之外
return 0;
}
正常来说,第一次输入错误,应该直接是重新开始,但是却出现这样子
直接跳过了上述那个代码..
原因
在第一次输入错误之后,scanf_s
跳过了输入提示并直接读取了下一个输入,这是由于输入流中仍然有残留的数据导致的。
当输入字符串 x x x x x↙,输入缓冲区里存放着x x x x x\n。
也就是执行如下代码时,输入字符串后,再继续循环
printf("请输入账号:\n");
scanf_s("%s", myAdmin,50); // 限制账号名的长度
printf("请输入密码:\n");
scanf_s("%d", &myPassword);
第一次scanf已经读完之后,开始第二次读取,但是缓冲区里还遗留有一个 \n .当第二个scanf读入时首先检查缓冲区,发现缓冲区里还有 \n ,而且正好匹配%s,于是直接读走 \n 给%s,所以直接跳过这个代码
printf("请输入账号:\n");
scanf_s("%s", myAdmin,50); // 限制账号名的长度
解决办法:
// 清空输入流
rewind(stdin);
把这个代码加在最后一个字符读取scanf后面就好了;
或者是加
int c;
while ((c = getchar()) != '\n' && c != EOF);
两个都行,都是为了清空输入缓冲区