题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。
-
只能由 a∼za∼z 之间 2626 个小写字母、A∼ZA∼Z 之间 2626 个大写字母、0∼90∼9 之间 1010 个数字以及
!@#$四个特殊字符构成。 -
密码最短长度 :6:6 个字符,密码最大长度 :12:12 个字符。
-
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。
输入输出样例
输入 #1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!
输出 #1
seHJ12!@
sjdkffH$123
说明/提示
【样例 1 解释】
输入被英文逗号分为了四组被检测密码:seHJ12!@、sjdkffH$123、sdf!@&12HDHa!、123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。
ps:由于我是用c语言写的,那就按照c的思路来分析,代码应该可以再优化或者有其他写法,大家有其他意见也可以分享一下,不多说,先上代码。
#include <stdio.h>
#include <string.h>
int main()
{
char str[101];
//gets(str);
scanf("%s",str);
getchar();//清除缓冲区的'\n',不过后面没有输入,不写这个也行
int len = strlen(str);
int i = 0;
int q = 0;//j的起始
for(int k = 0; k < len; k++)
{
int cnt = 0;
int da = 0,x = 0,c = 0,s = 0;//大写,小写,字符,数字
int flag = 1;//非法字符判断
for(; str[i] != ',' && str[i] != '\0';i++){
cnt++;//这里要注意末尾情况
}
if(cnt < 6 || cnt > 12) {
i++;
q = i;//记录跳过点
continue;
}
for(int j = q; j < i; j++){
//if里面的语句也可以写成赋值为1的形式
if(str[j] >= 'a' && str[j] <= 'z')
x++;
else if(str[j] >= 'A' && str[j] <= 'Z')
da++;
else if(str[j] >= '0' && str[j] <= '9')
s++;
else if(str[j] == '!' || str[j] == '@' || str[j] == '#' || str[j] == '$')
c++;
else
flag = 0;
}
if(((da && x) || (da && s) || (x && s)) && c && flag){
for(int j = q; j < i; j++){
printf("%c",str[j]);
}
printf("\n");
}
i++;//跳过逗号
q = i;
}
return 0;
}
测试点信息

自己写的过程中遇到的问题:
1.一开始没注意到非法字符也需要判断,还好后面补上了,大家也要看清题目,不然容易吃亏
2.这点折磨了我挺久的,就是写完后发现自己的代码一直是RE的状态,毕竟编译器上运行没有问题,调试也找不出来,后面怎么发现的呢?(博主是新手,不要喷我)经过高人指点
发现我箭头所指的值不是0,那就是程序跑的过程中崩溃了,原来是我没有考虑到输入的字符串中最后的位置是没有英文逗号的,而我没有加上判断(以下为出错原代码)

之后加了个对末尾的判断条件就对了(以下为改正后代码)

1712

被折叠的 条评论
为什么被折叠?



