解题思路:
1、声明变量m,声明一个字符指针ch,标记flag,设置四个标志up_f,down_f,num_f,other_f
2、循环m次,每次测试的都只有一组数据
1)五个标志都初始化
2)为这个指针动态分配50char内存
3)将第一个密码读入ch中
4)判断是否密码长度是否大于8且小于16,如果不是则flag=0
5)如果flag=1,则再判断是否有四种字符中的至少三种
6)循环,次数为密码长度
如果up_f=0并且这个字符处于'A'和'Z'之间,令up_f=1
如果down_f=0并且这个字符处于'a'和'z'之间,令down_f=1
如果num_f=0并且这个字符处于'0'和'9'之间,令num_f=1
如果other_f=0并且这个字符是特殊字符,令other_f=1
3、如果flag=1,并且up_f+down_f+....>=3,则输出YES,否则输出NO
注意事项:
1、使用up_f等四个标志,保证了在多个相同类型的字符输入时,判断只进入一次
2、这里使用动态数组,是因为假如使用定长数组,每次测试都必须初始化,这无疑是很难做到的,采用动态数组,可以在每次测试结束的时候就把内存释放掉,从而达到了初始化数组的目的
参考代码:
int main(int argc, char* argv[]) { int m, flag, up_f, down_f, num_f, other_f, i, len; char* ch; scanf("%d", &m); for (i = 0; i < m; i++) { /*标志初始化*/ up_f = down_f = other_f = num_f = 0; flag = 1; /*创建一个动态的char数组*/ ch = (char*)malloc(sizeof(char) * 50); /*把第一个密码读到ch中*/ scanf("%s", ch); len = strlen(ch); /*判断长度是否介于8-16*/ if (len < 8 || len >= 16) flag = 0; /*如果介于8-16*/ if (flag) { for (int j = 0; j < len; j++) { /*判断字符是什么类型的*/ if (up_f == 0 && ch[j] >= 'A' && ch[j] <= 'Z') up_f = 1; if (down_f == 0 && ch[j] >= 'a' && ch[j] <= 'z') down_f = 1; if (num_f == 0 && ch[j] >= '0' && ch[j] <= '1') num_f = 1; if (other_f == 0 && ch[j] == '~' || ch[j] == '!' || ch[j] == '@' || ch[j] == '#' || ch[j] == '$' || ch[j] == '%' || ch[j] == '^') other_f = 1; } } /*输出*/ if (flag == 1 && up_f + down_f + num_f + other_f >= 3) { printf("YES\n"); } else { printf("NO\n"); } free(ch); } return 0; }
0.0分
10 人评分
点我有惊喜!你懂得!浏览:1514 |
点我有惊喜!你懂得!浏览:3875 |
C语言程序设计教程(第三版)课后习题6.11 (C++代码)(有个库函数叫sqrt)浏览:844 |
printf基础练习2 (C++代码)(受教了,,%#o和%#x的用途)三人行,必有我师,,多看题解会有收获浏览:1873 |
点我有惊喜!你懂得!浏览:4105 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:1435 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:552 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:859 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:665 |
字符串问题 (C语言代码)浏览:1503 |