题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
#include <stdio.h>
#include <string.h>
#define NEEDNUM 100;
//首先验证长度
//其次确保包含三种元素
//验证没有3个字符及以上的重复
//重复的验证大概是取指针p到p+i,验证p+1后面有没有i个元素是相等的,用strncmp
int ElmentSum(int element[4]) {
int sum = 0;
for (int i = 0; i < 4; i++) {
sum += *(element + i);
}
return sum;
}
int main() {
int a = NEEDNUM;
char pswd[a][101];
//unsigned int islegal=0;//用32位来保存好像也不太够,不知道一组字符串会有多少个,所以还是老老实实的先全接受得到密码个数
int num = 0;
while (gets(pswd[num]))
{
if (*pswd[num] == NULL) break;
num++;
}
//int isLegal[num];
for (int i = 0; i < num; i++) {
if (strlen(pswd[i]) > 8) {
//if(Inclue3Element())
//用一个四元素的element数组来表示{0,0,0,0}是否包含所需的元素,若总和大于等于3即为通过
//一个循环整个字符串
//先判断数组的情况如果element的sum为0,则判断数字,小写字母,大写字母,符号
//若为sum=1,则验证是哪个为1,哪个是1就不去判断那个分支了
int element[4] = {0, 0, 0, 0};
for (int j = 0; j < strlen(pswd[i]); j++) {
if (ElmentSum(element) >= 3) break;
//A:65Z:90 a:97z:122 0:48 9:57
else {
if (element[0] == 0) {
if (pswd[i][j] >= 48 && pswd[i][j] <= 57) {
element[0]++;
continue;
}
}
if (element[1] == 0) {
if (pswd[i][j] >= 97 && pswd[i][j] <= 122) {
element[1]++;
continue;
}
}
if (element[2] == 0) {
if (pswd[i][j] >= 65 && pswd[i][j] <= 90) {
element[2]++;
continue;
}
}
if (element[3] == 0) {
if ((pswd[i][j] >= 48 && pswd[i][j] <= 57) || (pswd[i][j] >= 97 &&
pswd[i][j] <= 122) || (pswd[i][j] >= 65 && pswd[i][j] <= 90));
else element[3]++;
continue;
}
}
}
if (ElmentSum(element) >= 3) {
//printf("OK\n");
//不能有长度大于2的包含公共元素的子串重复
int isrepeat = 0;
for (int j = 0; j < strlen(pswd[i]); j++) {
char* p = pswd[i] + j; //不能是pswd[i][j]
char cap3char[3] = {*p, *(p + 1), *(p + 2)};
char capchar = *p;
//这样一个一个找循环有点多,优化一下
// for(int k=2;k<strlen(pswd[i])-3;k++)
// {
// if (strncmp(p,p+k,3)==0)
// {
// isrepeat=1;
// break;
// }
// }
while (strchr(p + 3, capchar) !=
0) { //若距离当前capchar右边3个字符以上有与capchar一样的字符
//int k=strchr(p+3,capchar)-p;
//要排除掉第一个
p = strchr(p + 1, capchar); //直接让p到下一个是capchar的地方
if (strncmp(cap3char, strchr(p, capchar), 3) == 0) {
isrepeat = 1;
break;
}
}
if (isrepeat == 1) {
//printf("NG\n");
break;
}
}
if (isrepeat == 1) {
printf("NG\n");
} else printf("OK\n");
} else printf("NG\n");
} else printf("NG\n"); //isLegal[i]=0;
}
return 0;
}
查看9道真题和解析
