无函数好理解版本(详细注解)
2026-02-27 22:41:02
发布于:湖北
44阅读
0回复
0点赞
作为一道大模拟的题目,我也是想了两年半,有一下题解(供参考,变量名解释见最下面):
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
getline(cin,s);
s += ','; //此处请看注解①
string pwd = "";
for(int i = 0; i <= s.length(); i++)
{
if(s[i] == ',')
{
if(!pwd.empty())
{
int len = pwd.length();
if(len >= 6 && len <= 12)
{
bool big = false,small = false,digit = false,special = false;
bool ok = true;
for(int j = 0; j < len; j++)
{
char c = pwd[j];
if(c >= 'A' && c <= 'Z') big = true;
else if(c >= 'a' && c <= 'z') small = true;
else if(c >= '0' && c <= '9') digit = true;
else if(c == '!' || c == '@' || c == '#' || c == '$') special = true;
else
{
ok = false;
break;
}
}
if(ok && special) // 根据题目这里需要密码的长度和特别字符同时成立
{
int cnt = 0;
if(big) cnt++;
if(small) cnt++;
if(digit) cnt++;
if(cnt >= 2) //这里就是题目中要求的至少两种的意思
{
cout << pwd << endl;
}
}
}
}
pwd = ""; //此处请看注解②
}
else
{
pwd += s[i]; // 这里我们就做没有遇到逗号时往pwd中加字符的操作
}
}
return 0;
}
注解①: 这里做重点讲解,我们要根据s.length()来讲,因为我们的代码中的最后一个密码的最后是没有逗号的,但是如果将最后一个密码单独拎出来写,那太复杂了,所以我们变更思路,“改变”一下我们的输入,在原字符串的末尾加上一个逗号,这样我们在下面的if语句中就可以直接写if(s[i] == ',') 减少代码量。
注解②: 此处非常关键,有两个方面⑴ 对于那些密码长度不合规的密码,在经过if(len >= 6 && len <= 12) 的判断之后,会直接跳出判断,此时我的临时pwd会直接归零,以便开始下一个密码的检查。
⑵ 对于密码长度合规的密码,在判断完其他的条件并输出后,也是以便下一个密码的判断而归零。
说明:"ok"代表用于检查的密码的长度的布尔值
"big" 代表检查大写字母是否合规的布尔值
"small" 代表检查小写字母是否合规的布尔值
"digit" 代表检查关于数字是否合规的布尔值
"special" 代表检查关于!、@、#、$这四个特殊符号是否合规的布尔值


主播手写的,可以留个赞么,感谢阅读!
这里空空如也




有帮助,赞一个