今天在准备C语言复试,遇到了一个问题,描述如下:
用户在终端可以自定义初始化字符串密码,并且在登录时要进行验证是否正确,在实际编程的时候遇到如下两个问题:
- 实现用户想自定义多长的密码,就定义多长的密码,所以需要实现输入结束的判断。思路是:判断当用户输入的 password[i] = ‘\r’ 时,将其变成 ‘\0’ ,并 break 出 for 循环
if( password[i]=='\r' ){ //此 if 语句用于当用户输入回车时,密码输入结束
password[i] = '\0';
break;
}
- 在终端用户输入密码时出错时,应允许用户退格删除重新输入,但实际上发现在终端输入状态敲击 backspace 键只会被当做字符输入进字符串。思路是:判断用户输入的字符 ASCII 码值是否为 8,若是,则执行如下代码( i==0 判断用于,当未输入时,退格键无效)
if( password[i]==8 ){ //此 if 语句用于当用户输入退格时,删掉一个字符
if( i==0 )
continue;
putchar('\b');
putchar(' ');
putchar('\b');
i = i-2;
}
所以完整代码为:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define NUM 10
int main()
{
int i=0;
char password[NUM],input[NUM]; //定义两个数组,password存放初始化密码,input登录密码
printf("Please input the password:"); //下面 for 循环用于用户初始化密码
for(i=0;i<NUM;i++)
{
password[i] = getch();
if( password[i]=='\r' ){ //此 if 语句用于当用户输入回车时,密码输入结束
password[i] = '\0';
break;
}
else if( password[i]==8 ){ //此 if 语句用于当用户输入退格时,删掉一个字符
if( i==0 )
continue;
putchar('\b');
putchar(' ');
putchar('\b');
i = i-2;
}else
putchar(password[i]); //明文显示用户初始化的密码
}
printf("\n\nsign in:"); //用户登录时,输入密码进行校验,判断是否与初始化密码 password一致
for(i=0;i<NUM;i++)
{
input[i] = getch();
if( input[i]=='\r' ){ //此 if 语句用于当用户输入回车时,密码输入结束
input[i] = '\0';
break;
}
else if( input[i]==8 ){ //此 if 语句用于当用户输入退格时,删掉一个字符
if( i==0 )
continue;
putchar('\b');
putchar(' ');
putchar('\b');
i = i-2;
}
else
putchar('*'); //将用户输入的密码显示成一串***,以保证安全性
}
//此注释部分用于测试,当运行出错时,将两个字符数组分别输出以寻找不匹配的地方
/* printf("\n");
printf("input is:")
for(i = 0;i < NUM;i++){
putchar(input[i]);
}
printf("\n");
printf("password is:");
for(i = 0;i < NUM;i++){
putchar(password[i]);
} */
if( strcmp(password,input)==0 ) //判断 password 与 input 是否相等
printf("\nthe password is right !\n");
else
printf("\nthe password is wrong !\n");
return 0;
}