/*编写代码模拟三次密码输入的场景.
密码正确,提示"登录成功",密码错误,可以重新输入,
最多能输入三次密码,三次均错,则提示退出程序
/
/
思路:
1.设置密码;
2.用户输入密码;
3.判断用户输入密码是否正确:
a)若正确,输出相应提示;
b)若不正确,输入相应提示,并让用户重新输入,三次错误后,退出程序;
(用strcmp()函数可以方便快捷实现三次密码的比较)
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 8 //定义存储密码的字符串长度(实际密码长度为N-1)
//设置密码函数
int set_password(char str[]){
int i;
char ch = '\0'; //变量串用以吸收多余字符,初始化为 \0'
printf("请设置%d位密码(多余位数无效!):\n", N - 1); //提示用户输入信息
for (i = 0; i < N - 1; ++i){ //循环遍历数组str[];
str[i] = getchar(); //逐个保存数据
}
str[i] = '\0'; //将数组最后一个元素赋值为'\0'(即将数组变为字符串)
while (ch = getchar() != '\n' && ch != EOF){ //清除缓冲区数据
;
}
}
//登录函数
int log_on(char str[]){
int count = 3; //变量count为输入密码次数
int ret; //变量ret用以接收strcmp()函数的返回值
char ch; //变量ch用以吸收用户输入的多余字符
char str1[N]; //数组str1保存用户输入的密码
while (count > 0){ //若还有输入密码机会
printf("请输入%d密码(多余位数无效!):\n",N - 1); //提示用输入信息
memset(str1, 0, N); //将数组str1初始化为0
for (int i = 0; i < N - 1; ++i) {//保存用户输入的7个字符作为密码
str1[i] = getchar(); //每次保存一个字符到指定位置
}
while (ch = getchar() != '\n' && ch != EOF){ //清空输入缓冲区
;
}
ret = strcmp(str1, str); //比较两字符串,将返回值赋给ret
if (ret == 0){ //若密码正确
printf("登录成功.\n"); //打印输出提示信息
return 1; //返回值为1
}
else {
--count; //尝试密码机会减1
if (count == 0){ //若没有尝试密码机会
printf("三次机会已用完,程序即将退出!\n"); //打印输出提示信息
continue; //跳过剩下语句
}
printf("密码错误,您还有%d次机会:\n",count); //打印输出提示信息
}
}
return 0; //返回值为0
}
//主函数
int main(){
char str[N]; //数组str[]用以保存设置的数据
set_password(str); //调用设置密码函数
log_on(str); //调用登录函数
system("pause");
return 0;
}
输入数据时未及时取走的数据会留在缓冲区,从而影响下一次的数据输入,
所以在输入一次数据后,最好对缓冲区进行清理.可以用fflush(stdin);代替上
述清除缓冲区数据部分,但不推荐使用,因为fflush(stdin)兼容性并不强!