【c程序】校验密码不允许键盘连续四个按键输入

/************************************************************************************* 
* 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;
}

猜你喜欢

转载自blog.csdn.net/u012503639/article/details/82011436
今日推荐