B3843 [GESP202306 三级] 密码合规
欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。
:::align{center} :::
首先,我们需要处理输入。题目给出的输入是一长串由逗号分隔的密码,一个非常巧妙的方法是,在读取了整行输入后,我们可以在字符串的末尾手动添加一个逗号。这样做的好处是,无论是中间的密码还是最后一个密码,它们后面都有一个逗号作为结束标志,我们的处理逻辑就可以统一起来,避免为最后一个密码写特殊的处理代码。这部分的代码:
int main() {
string s;
cin >> s;
s += ',';
string pwd = "";
for (________) {
________ // 枚举字符串的每个字符
if (________) {
// 遇到逗号,说明一个密码结束了
// 检查这个密码是否合规
if (________) {
cout << pwd << endl;
}
pwd = "";
} else {
________; // 拼接密码
}
}
return 0;
}
接下来是关键的检查环节。我们可以编写一个专门的函数来负责检查单个密码是否合规。
一、长度检查。这是最简单的,密码的长度必须在 6 到 12 个字符之间,不多不少。如果长度不达标,直接判定为不合格。
二、字符合法性检查。我们需要逐一检查密码中的每一个字符。我们可以设置几个“标志”变量,分别记录是否出现了小写字母、大写字母、数字和特殊字符。在遍历密码时,如果遇到一个字符,它既不是小写字母,也不是大写字母,也不是数字,更不是那四种允许的特殊字符之一,那就说明出现了非法字符,这个密码也立刻被判定为不合格。
三、内容组合检查。如果在第二步中,所有字符都合法,我们就要利用检查过程中记录下的“标志”变量来进行最后的判断。规则要求:1. 必须至少有一个特殊字符。2. 在小写字母、大写字母、数字这三类中,必须至少出现两种。我们可以统计一下这三类字符出现了几种,如果种类数小于 2,或者特殊字符根本没出现,那么这个密码同样不合格。
只有当一个密码顺利通过了以上所有的检查,我们才能认定它是一个合规的密码,并按照题目的要求将它输出。
bool check(string s) {
int len = ________; // 获取字符串长度
if (________) { // 长度检查
return false;
}
int low = 0, upp = 0, dig = 0, spc = 0;
for (________) {
________ // 枚举字符串的每个字符
if (________) { // 是小写字母
low = 1;
} else if (________) { // 是大写字母
upp = 1;
} else if (________) { // 是数字
dig = 1;
} else if (________) { // 是特殊字符
spc = 1;
} else {
return false;
}
}
if (________ && ________) {
return true;
}
return false;
}