• 判断密码是否包含键盘连续字母


    新增内容为增加键盘列排序检测。

    原理:
    用两个与传入密码长度相等的一维数组(Row行数组,Column列数组)
    按密码顺序在二维键盘数组中查找每个字符,找到了则用
    一维行列数组分别存放密码中每个字符的行号和列号
    然后循环分析行号和列号是否满足二维键盘数组的值来判断是否连续

    BOOL IsKeyBoardContinuousChar( LPCTSTR lpStr )
    {
    if ( lpStr == NULL || _tcslen(lpStr) == 0 )
    {
    return FALSE;
    }
    // 注意,下面的键盘字符表都只列出小写字符,判断前会将输入字符中的
    // 大写字母都转换成小写字母
    // 非shift键盘字符表
    TCHAR aaCharTable1[4][13] =
    { ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘0’, ‘-’, ‘=’, ‘\0’,
    ‘q’, ‘w’, ‘e’, ‘r’, ‘t’, ‘y’, ‘u’, ‘i’, ‘o’, ‘p’, ‘[’, ‘]’, ‘\’,
    ‘a’, ‘s’, ‘d’, ‘f’, ‘g’, ‘h’, ‘j’, ‘k’, ‘l’, ‘;’, ‘’', ‘\0’, ‘\0’,
    ‘z’, ‘x’, ‘c’, ‘v’, ‘b’, ‘n’, ‘m’, ‘,’, ‘.’, ‘/’, ‘\0’, ‘\0’, ‘\0’,
    };

    // 包含shift键盘的字符表
    TCHAR aaCharTable2[4][13] =
    { '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\0',
      'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '{', '}', '|',
      'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', '"', '\0', '\0',
      'z', 'x', 'c', 'v', 'b', 'n', 'm', '<', '>', '?', '\0', '\0', '\0'
    };
    
    // 获取坐标位置
    int nStrLen = _tcslen( lpStr );
    // 定义位置数组
    // row - 行,col - column 列
    int* pRowCharPos = new int[nStrLen];
    int* pColCharPos = new int[nStrLen];
    for (int i = 0; i < nStrLen; i++) 
    {
    	pRowCharPos[i] = 0;  // 行索引
    	pColCharPos[i] = -1; // 列索引
    
    	// 考虑大小写,都转换成小写字母
    	TCHAR chLower = lpStr[i];
    	if ( chLower >= 'A' && chLower <= 'Z' )
    	{
    		chLower += 32;
    	}
    
    	// 检索在表1中的位置,构建位置数组
    	for ( int nRowTable1Idx = 0; nRowTable1Idx < 4; nRowTable1Idx++ ) 
    	{
    		for ( int nColTable1Idx = 0; nColTable1Idx<13; nColTable1Idx++ ) 
    		{
    			if ( chLower == aaCharTable1[nRowTable1Idx][nColTable1Idx] ) 
    			{
    				pRowCharPos[i] = nRowTable1Idx;
    				pColCharPos[i] = nColTable1Idx;
    			}
    		}
    	}
    
    	// 在表1中没找到,到表二中去找,找到则continue
    	if ( pColCharPos[i] != -1 ) 
    	{
    		continue;
    	}
    
    	// 检索在表2中的位置,构建位置数组
    	for ( int nRowTable2Idx = 0; nRowTable2Idx < 4; nRowTable2Idx++ ) 
    	{
    		for (int nColTable2Idx = 0; nColTable2Idx<13; nColTable2Idx++ ) 
    		{
    			if ( chLower == aaCharTable2[nRowTable2Idx][nColTable2Idx] ) 
    			{
    				pRowCharPos[i] = nRowTable2Idx;
    				pColCharPos[i] = nColTable2Idx;
    			}
    		}
    	}
    }
    
    // 匹配坐标连线
    for ( int j = 1; j <= nStrLen-2; j++ ) 
    {
       //同一行
    	if (pRowCharPos[j - 1] == pRowCharPos[j] && pRowCharPos[j] == pRowCharPos[j + 1]) 
    	{
    		// 键盘行连续(asd)或者键盘行反向连续(dsa)
    		if ( (pColCharPos[j - 1] + 1 == pColCharPos[j] && pColCharPos[j] + 1 == pColCharPos[j + 1])  || 
    			 (pColCharPos[j + 1] + 1 == pColCharPos[j] && pColCharPos[j] + 1 == pColCharPos[j - 1]) ) 
    		{
    			return TRUE;
    		}
    	} 
    	
    //新增内容
    //同一列
    if (pColCharPos[k - 1] == pColCharPos[k] && pColCharPos[k] == pColCharPos[k + 1])
    		{
    			//键盘列连续(qaz)或者键盘列反向连续(zaq)
    			if ((pRowCharPos[k - 1] + 1 == pRowCharPos[k] && pRowCharPos[k] + 1 == pRowCharPos[k + 1]) ||
    				(pRowCharPos[k - 1] - 1 == pRowCharPos[k] && pRowCharPos[k] - 1 == pRowCharPos[k + 1]))
    			{
    				return TRUE;
    			}
    		}	
    }
    
    return FALSE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    }

    看图解码

    在这里插入图片描述

    判断密码是否连续3个及以上重复或者字母连续

    for (int i = 0; i {
    int n1 = int(newPassword[i]);
    int n2 = int(newPassword[i+1]);
    int n3 = int(newPassword[i+2]);
    // 判断重复字符
    if (n1 == n2 && n1 == n3)
    {
    return TRUE;
    }
    // 判断连续字符: 正序 + 倒序
    if ((n1 + 1 == n2 && n1 + 2 == n3) || (n1 - 1 == n2 && n1 - 2 == n3))
    {
    return TRUE;
    }
    }
    return FALSE;

  • 相关阅读:
    【Java网络原理】 四
    如何将bootlooder和APP合成一个文件
    视觉与机器人的九点标定(二)
    Python Opencv实践 - 凸包检测(ConvexHull)
    优思学院|六西格玛管理常用的假设检验是什么?
    RHCE之WEB服务器作业
    Android 10.0 Launcher3 抽屉式(双层)app列表排序
    【linux】从linux学软件开发 | 变量与echo
    idea 中Maven项目转Gradle项目
    “千方百计“测病毒
  • 原文地址:https://blog.csdn.net/weixin_43214644/article/details/126153994