/*************************************************************************************
* Copyright (C) 2018, XX大学.
* All rights reserved.
* File Name: CheckPassword.c
* Author: 锤子Ethan
* Date: 2018-7-9
* Version : V1.0
*
* Description: 实现下面键盘校验功能,具体要求:
1) 至少8个字符长度
2) 数字&字符混合
3) 不能超过3个连续(1234,4321, abcd)
4) 键盘上不超过四个键连续(asdf, 7890)
5) 不超过四个键不重复(aaaa, 2222)
*
*输入描述:输入一串密码
*输入描述:对密码进行校验,显示错误原因提示。
*************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define bool int
#define false 0
#define true 1
#define PASSMAXLEN 20
#define PASSMINLEN 8
#define INPUTPASSMAX 10
#define KEY_OK 0
#define LEN_ERR -1
#define NUMALPMIX_ERR -2
#define FOURCONTIN_ERR -3
#define BOARDRULE_ERR -4
static int IsLenlegal(const char* key,int len);
static int IsNumAlpMix(const char* key,int len);
static int IsFourContin(char* key,int len);
static int IsKeyBoardRule(char* key,int len);
static int IsRepeated(char* key,int len);
void ToLower(char* key);
void ReadKey(char* key);
void ToLower(char* key)
{
char* ptr=NULL;
for(ptr=key;*ptr;ptr++)
{
*ptr=tolower(*ptr);
}
}
void Reverse(char* key)
{
int i=0;
int j=0;
int k=0;
int len = strlen(key);
char TemStr[4];
for(i=len-1;i>=0;i--)
{
TemStr[j]=key[i];
j++;
}
for(k=0;k<len;i++)
{
key[i]=TemStr[i];
}
}
/*校验长度,不小于8*/
static int IsLenlegal(const char* key,int len)
{
if(key==NULL)
{
printf("Key is NULL!\n");
return LEN_ERR;
}
if(PASSMINLEN>len||PASSMAXLEN<len)
{
return LEN_ERR;
}
return KEY_OK;
}
/*校验数字与字符混合*/
static int IsNumAlpMix(const char* key,int len)
{
bool isAlp=false;
bool isNUm=false;
int i=0;
for( i=0; i<len; i++)
{
if( key[i] >= 'A' && key[i]<='z')
{
isAlp = true;
continue;
}
if(key[i]>='0' && key[i]<='9')
{
isNUm = true;
continue;
}
}
if(!(isAlp && isNUm))
{
return NUMALPMIX_ERR;
}
return KEY_OK;
}
/*校验是否字符四个连续*/
static int IsFourContin(char* key,int len)
{
int i=0;
for(i=0;i<len-3;i++)
{
//printf("key[i] is %c.\n",key[i]);
//printf("key[i]+1 is %c.\n",(key[i]+1)%256);
//printf("key[i]+2 is %c.\n",(key[i]+2)%256);
if(key[i+1]==((key[i]+1)%256) && key[i+2]==((key[i+1]+1)%256)&& key[i+3]==((key[i+2]+1)%256))
{
printf("It cannot contain more than 3 consecutive characters.Please try again.\n");
return ;
}
/*边缘处理以及逆序处理*/
}
return KEY_OK;
}
/*校验是否字符四个相同*/
static int IsRepeated(char* key,int len)
{
int i=0;
for(i=0;i<len-3;i++)
{
if(key[i]==key[i+1] && key[i+1]==key[i+2]&& key[i+2]==key[i+3])
{
return FOURCONTIN_ERR;
}
}
return KEY_OK;
}
/*校验是否键盘连续四个以及是否字符四个连续*/
static int IsKeyBoardRule(char* key,int len)
{
int i=0;
int j=0;
int k=0;
char keyboard_1[11]="qwertyuiop";
char keyboard_2[10]="asdfghjkl";
char keyboard_3[8]="zxcvbnm";
char keyboard_4[12]="01234567890";
char keyboard_5[27]="abcdefghijklmnopqrstuvwxyz";
char TempStr[5];
char ReStr[4];
memset(TempStr, 0, sizeof(TempStr));
memset(ReStr, 0, sizeof(ReStr));
for(i=0;i<len-3;i++)
{
for(j=0;j<4;j++)
{
TempStr[j]=key[i+j];
}
//printf("The Current TempStr is %s\n",TempStr);
for(k=0;k<4;k++)
{
ReStr[k]=TempStr[3-k];
}
if(strstr(keyboard_1,TempStr) || strstr(keyboard_2,TempStr) || strstr(keyboard_3,TempStr)|| strstr(keyboard_4,TempStr)|| strstr(keyboard_5,TempStr)
||strstr(keyboard_1,ReStr) || strstr(keyboard_2,ReStr) || strstr(keyboard_3,ReStr)|| strstr(keyboard_4,ReStr) || strstr(keyboard_5,ReStr))
{
return BOARDRULE_ERR;
}
}
return KEY_OK;
}
/*Check Password*/
int main()
{
int ErrorType=0;
int len=0;
char Key[PASSMAXLEN];
int InputNum=INPUTPASSMAX;
memset(Key, 0, sizeof(Key));
printf("Please input your favorite password according to the rules.\n");
while(InputNum--)
{
printf("Password :");
gets(Key);
len=strlen(Key);
ToLower(Key);
ErrorType=IsLenlegal(Key,len);
if(KEY_OK!=ErrorType)
{
printf("========================================================================\n");
printf("||ERROR!!ERROR!!ErrorType is %d.After analysis, the conclusion is drawn.||\n",ErrorType);
printf("||Length is at least 8 characters,current length is %d.Please try again. ||\n",len);
printf("=========================================================================\n");
continue;
}
ErrorType=IsNumAlpMix(Key,len);
if(KEY_OK!=ErrorType)
{
printf("=========================================================================\n");
printf("||ERROR!!ERROR!!ErrorType is %d.After analysis, the conclusion is drawn.||\n",ErrorType);
printf("||The Key should contain both letters and numbers.Please try again. ||\n");
printf("=========================================================================\n");
continue;
}
ErrorType=IsRepeated(Key,len);
if(KEY_OK!=ErrorType)
{
printf("=================================================================================\n");
printf("||ERROR!!ERROR!!ErrorType is %d.After analysis, the conclusion is drawn. ||\n",ErrorType);
printf("||It cannot contain more than 3 identical repeating characters.Please try again.||\n");
printf("=================================================================================\n");
continue;
}
ErrorType=IsKeyBoardRule(Key,len);
if(KEY_OK!=ErrorType)
{
printf("===================================================================================\n");
printf("||ERROR!!ERROR!!ErrorType is %d.After analysis, the conclusion is drawn. ||\n",ErrorType);
printf("||The letters and numbers in the case where the keyboard is positioned side by side||\n");
printf("||on the Q-key will not accept more than 3 repeating sequences.Please try again. ||\n");
printf("===================================================================================\n");
continue;
}
/*密码校验通过*/
printf("*************************************************************************************\n");
printf("Congratulations!Password is OK, please firmly remember your password:%s \n",Key);
printf("*************************************************************************************\n");
break;
}
return 0;
}
【c程序】校验密码不允许键盘连续四个按键输入
猜你喜欢
转载自blog.csdn.net/u012503639/article/details/82011436
今日推荐
周排行