密码输入加密与上下左右键

密码输入加密与上下左右键

这周开始写课设,对于密码输入及加密这个部分进行了设计,同时也考虑了暴力输入,如输入上下左右键的情况。

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;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值