密码输入加密与上下左右键
这周开始写课设,对于密码输入及加密这个部分进行了设计,同时也考虑了暴力输入,如输入上下左右键的情况。
1,输入加密最基本是输入不能有回显。
所以我使用了 getch函数来接受从键盘的输入,注意getch函数没有回显且无缓存区。
2,输入数字 字母 或 符号 时才能输入并且显示 “*“
我用了判断输入字符的acsii码来判断是否为数字字母或符号,
if (a >= 33 && a <= 126)
但是!!!!
这样你在输入上下左右键时还是会显示“ * ”,并且输入一次上下左右键就会输出一个“ * ”。
但是我明明限制了输入单个字符的acsii码,为什么上下左右键还是能输入呢?
后来经过我反复的测试,我尝试输入上下左右键再输出上下左右键的acsii值
#include <stdio.h>
#include <conio.h>
int main(void)
{
char p1,p2,p3,p4;
p1=getch();
p2=getch();
p3=getch();
p4=getch();
printf("%d\n",p1);
printf("%d\n",p2);
printf("%d\n",p3);
printf("%d\n",p4);
return 0;
}
然后我输入了上下键,它就显示了
我只是输入了两个键它就输入完毕了,我思考后得出,
上下左右键的acsii码是由两个数和起来的,输入一个上下左右键相当于输入两个字符,所以我输如两个上下左右键系统就已经接受四个字符了,即输入结束了。
上下左右键的acsii码分别为:
上:-32 72
下:-32 80
左:-32 75
右:-32 77
然后回到密码输入部分,为什么输入上下左右键它能输入成功呢?-32明明不符合我的范围
原因和上面一样,你输入一个上下左右键就相当于非常快的输入了两个单字符,一个的acsii码是-32
一个是72、75、77或80。虽然-32不符合,但是72这些数符合,于是系统便自然而然的认为我们输入了正确字符。
那么如何解决这个问题呢?
输入上下左右键对洗头来说只是输入了一个-32 以及一个72,这两个输入并不在一个循环中,如何判断我输入的是上下左右键呢?
这里我用了一个char类型的 量来保存我的上一个输入值,如果上次输入-32 这次输入72之类的,那么便判定我是输入了一个上下左右键,需要忽略这次输入。
a=getch();
if(b==-32)
{
b=0;
i--;
}
else
{
b=a;
if(a>=33&&a<=126)
{
if(i<6)
{
printf("*");
p[i]=a;
}
else
{
i--;
}
}
这是那一部分的代码。
3,如何实现删除功能
首先,如何辨别是否需要进行删除呢?
这边我用输入字符的ascii为8时,即我在键盘上按下的键为Backspace时判定需要进行删除。
那么如何删除屏幕上的 * 呢?
这边我使用了退格符\b
printf("\b \b")
此语句的含义为,退格将前一格用空格代替,在将光标往前移动一位。
即实现了删除 * 并且移动光标的操作。
4,判断输入完毕及输入限制。
如何判断输入完毕?
此处我还是使用了判断输入字符的acsii码,输入回车上时即输入字符acsii为13时,输入完毕。
输入限制
输入限制控制循环即可。
5,完整代码
#include <stdio.h>
#include <conio.h>
#include<string.h>
#include<stdlib.h>
int main (void)
{
int i;
char p[7],a,b,q[7];
FILE *fp;
fp=fopen("密码.txt","rt");
fscanf(fp,"%s",q);
for(i=0;i<=6;i++)
{
a=getch();
if(b==-32)
{
b=0;
i--;
}
else
{
b=a;
if(a>=33&&a<=126)
{
if(i<6)
{
printf("*");
p[i]=a;
}
else
{
i--;
}
}
if(a==8)//删除。
{
if(i>0)
{
printf("\b \b");
i=i-2;
}
else
{
i--;
}
}
if(a==13)//回车,表示输入完毕。
{
p[i]='\0';
break;
}
if(a<8||(a>8&&a<13)||(a>13&&a<33)||a>126)
{
i--;
}
}
}
if(strcmp(p,q)==0)
{
printf("\n密码正确");
}
else
{
printf("\n密码错误");
}
return 0;
}