题目描述如下:
注册网站时,需要使用包含不同类型(数字、符号、大写字母、小写字母)的字符,和特定长度。检查一个密码内容同时包含以上 4 种类型的字符,并且长度在8 - 120 个字符之间。符合要求,返回 0;长度不符合返回 1;类型不符合要求返还 2。
可以一次输入多组密码,以空格符间隔,空格符不作为密码。
输入描述
需要验证的密码,多个密码以空格符间隔,空格符不作为密码的一部分
输出描述
每个密码的检查结果,每个结果需要换行输出
样例输入
123 12345678 123abcABC!!!
样例输出
1
2
0
总之我又马后炮了,做的时候没写出main函数,做出来了就记录一下,我这里特殊字符只考虑了ascii码从33至47的字符'!'至'/',(至于能a多少我也不清楚应为当时没写出main函数,反正是肯定可以a大部分),我直接用的循环暴力,传入的参数是一个二维字符数组,一行即代表一个字符串(密码),具体代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;
//输出的整型数字
int LengthError = 1;
int TypeError = 2;
int Pass = 0;
//函数体
void Validation(char** m,int num)
{
for (int i = 0; i < num;++i)
{
//开始扫描一个密码
bool Length = false;//初始化长度检验标志位
//初始化类型检验标志位
bool Type1 = false;//数字
bool Type2 = false;//小写字母
bool Type3 = false;//大写字母
bool Type4 = false;//符号
int mLength = strlen(m[i]);//每个密码的长度
if (mLength<8||mLength>120)//长度不符合
{
Length = true;
}
for (int j = 0; j < mLength;++j)//扫描每个密码
{
//其中拥有任意一类型字符即把该标志位置为true
if (m[i][j]>='0'&&m[i][j]<='9')
{
Type1 = true;
}
if (m[i][j]>='a'&&m[i][j]<='z')
{
Type2 = true;
}
if (m[i][j]>='A'&&m[i][j]<='Z')
{
Type3 = true;
}
if (m[i][j] >= '!'&&m[i][j] <= '/')
{
Type4 = true;
}
}
//扫描完一个密码出来打印结果
if (Length)//优先判断长度错误
{
cout << LengthError<< endl;
}
else if (!(Type1&&Type2&&Type3&&Type4))//其次判断类型错误(如果四类字符全部拥有条件为false,如果一类没有条件为true)
{
cout << TypeError<< endl;
}
else//密码无误
{
cout << Pass<< endl;
}
}
return;
}
int main()
{
//动态创建二维数组来存储输入
char** mm = new char*[100];
for (int i = 0; i < 100;i++)
{
mm[i] = new char[200];
}
char c;//获取输入的字符
int i = 0;
int j = 0;
while ((c=getchar())!='\n')//如果没有输入回车
{
if (c!=' ')//如果输入的字符不是空格,则连续输入一个密码
{
ungetc(c, stdin);//把getchar从输入流取出来的字符放回输入流
cin >> mm[i][j++];
}
else//如果输入了空格,则输入下一个密码
{
mm[i][j] = '\0';//封闭字符串
++i;
j = 0;
}
}
mm[i][j] = '\0';//封闭最后一个输入的字符串
int mNum = i+1;//mNum存放输入的密码数
cout << mm[0]<< endl;
cout << mm[1]<< endl;
cout << mm[2]<< endl;
cout << mNum<< endl;
Validation(mm,mNum);
return 0;
}
运行结果如下:
问题不太大,能想到的最直观的解法就是暴力。