一.题目描述
小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
- 密码只能由大写字母,小写字母,数字构成;
- 密码不能以数字开头;
- 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
- 密码长度至少为8
现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
输入描述:
输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述: 输入n行,如果密码合法,输出YES,不合法输出NO
二.思路分析
1.该题的主要难点在于判断语句该如何嵌套合理嵌套以及如何判断密码是否符合要求
2.首先嵌套的思路应该将不相关的两个合成一个,如要求2和要求4
3.其次再考虑条件之间的包含关系,如要求1和要求3哪一个包含哪一个
4.然后如何表示字母和数字呢,因为这里输入的是一串密码,因此应该用数组来接收,再因为既包含了字母也包含了数字,所以要用字符型
5.题目中说到是输入n个密码,所以是循环输入
6.还有一个难点就是中途判断出结果如何结束本次循环进入下一个循环
三.代码展示
#include<stdio.h>
#include<string.h>
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int j = 0;
char arr[100];
for (i = 0; i < n; i++)//输入多组密码
{
scanf("%s", arr);
int flag[3] = { '\0' };
int a = 0;
if (arr[0] >= '1' && arr[0] <= '9' || strlen(arr) < 8)//判断密码长度是否大于8以及密码是否以数字开头
{
printf("NO\n");
continue;//结束本次循环
}
for (j = 0; j < strlen(arr); j++)
{
if (arr[j] >= '0' && arr[j] <= '9' || arr[j] >= 'A' && arr[j] <= 'Z' || arr[j] >= 'a' && arr[j] <= 'z')//判断密码是否由数字、大写字母、小写字母组成
{
if (arr[j] >= '0' && arr[j] <= '9')
{
flag[0] = 1;
}
if (arr[j] >= 'A' && arr[j] <= 'Z')
{
flag[1] = 1;
}
if (arr[j] >= 'a' && arr[j] <= 'z')
{
flag[2] = 1;
}
}
else
{
printf("NO\n");
a = 1;
break;
}
}
if (a == 0)
{
if (flag[0] + flag[1] + flag[2] >= 2)//判断密码是否包含三种组成部分中的两种
{
printf("YES\n");
continue;
}
else
{
printf("NO\n");
continue;
}
}
}
return 0;
}
最后:
每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。
在这里送大家一句话:广积粮,缓称王!