记录3
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[110]={};
int cnt_a=0,cnt_A=0,cnt_0=0,cnt_s=0;
int sum=0,begin=0;
cin>>a;
int len=strlen(a);
for(int i=0;i<=len;i++){
if(a[i]>='a'&&a[i]<='z') cnt_a++;
else if(a[i]>='A'&&a[i]<='Z') cnt_A++;
else if(a[i]>='0'&&a[i]<='9') cnt_0++;
else if(a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$') cnt_s++;
else if(a[i]==','||a[i]=='\0'){
sum=cnt_a+cnt_A+cnt_0+cnt_s;
if(sum>=6&&sum<=12){
if(!cnt_a+!cnt_A+!cnt_0<=1&&cnt_s>=1){
for(begin;begin<i;begin++) cout<<a[begin];
cout<<endl;
}
}
cnt_a=0,cnt_A=0,cnt_0=0,cnt_s=0,sum=0;
begin=i+1;
}else{
while(1){
i++;
if(a[i]==','||a[i]=='\0') break;
}
begin=i+1;sum=0;
cnt_a=0,cnt_A=0,cnt_0=0,cnt_s=0;
}
}
return 0;
}
突破点
只能由 a∼z 之间 26 个小写字母、A∼Z 之间 26 个大写字母、0∼9 之间 10 个数字以及
!@#$四个特殊字符构成。密码最短长度 :6 个字符,密码最大长度 :12 个字符。
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个
此类需要满足的要求,是if条件判断,进行信息分析与转化
提醒:一个字符只能是字母或者数字或者特殊字符,所以是多选一,由此想到else if类型
注意点:题目列了三个要求,但是共有四个条件,不要遗漏“以及至少有四个特殊字符中的一个”
思路
- 存进去输入的字符串,接着依次进行遍历(for循环)
- 将每的一段进行分割处理,对每一个字符进行判断并统计
- 识别到退出字符或者识别到'/0',判断是否符合输出标准
提醒:设置一个变量当作指针来始终指向当前段的开始,识别到了不符合的字符直接跳过这段字符,进行下一段的判断
代码简析
int cnt_a=0,cnt_A=0,cnt_0=0,cnt_s=0;
对字母跟数字还有特殊字符进行统计,方便后面的判断
if(!cnt_a+!cnt_A+!cnt_0<=1&&cnt_s>=1)
默认各类型初始cnt计数为0,那么如果有则非0,取反后为0
“大写字母,小写字母和数字必须至少有其中两种”,说明至少有三个cnt变量计数有两个0,即三个数和<=1。
else{
while(1){
i++;
if(a[i]==','||a[i]=='\0') break;
}
begin=i+1;sum=0;
cnt_a=0,cnt_A=0,cnt_0=0,cnt_s=0;
}
识别到了非规定输入,跳到else分支,直接找到结束符并初始化变量,因为数组故意开大了一点,所以不必担心“begin=i+1”会越界。
补充
也可以通过切割字符串来进行对比,这里补充下切割字符串substr() 的方法
在C++中,
std::string类提供了substr方法,用于从字符串中提取子字符串。这个方法非常有用,可以方便地处理字符串的切片操作。以下是一个简单的介绍和示例,展示如何使用substr方法来处理字符串。
substr方法的原型
substr方法的原型如下:std::string substr(size_t pos = 0, size_t len = npos) const;参数
pos:子字符串的起始位置,默认值为0。
len:子字符串的长度,默认值为std::string::npos,表示从pos开始到字符串末尾。返回值
返回从位置
pos开始,长度为len的子字符串。异常
如果
pos超出字符串的范围,会抛出std::out_of_range异常。如果
len超出字符串的范围,substr会返回从pos开始到字符串末尾的子字符串。示例代码
示例1:提取子字符串
#include <iostream> #include <string> using namespace std; int main() { string str = "Hello, World!"; string sub = str.substr(7, 5); // 从位置7开始,提取长度为5的子字符串 cout << sub << endl; // 输出:World return 0; }示例2:省略长度参数
#include <iostream> #include <string> using namespace std; int main() { string str = "Hello, World!"; string sub = str.substr(7); // 从位置7开始,提取到字符串末尾 cout << sub << endl; // 输出:World! return 0; }示例3:处理越界情况
#include <iostream> #include <string> using namespace std; int main() { string str = "Hello, World!"; try { string sub = str.substr(20, 5); // 位置20超出字符串范围 cout << sub << endl; } catch (const std::out_of_range& e) { cout << "Error: " << e.what() << endl; // 输出:Error: basic_string::substr: __pos (which is 20) > this->size() (which is 13) } return 0; }使用
substr处理字符串
substr方法可以方便地用于处理字符串的切片操作。以下是一些常见的用法:1. 提取特定部分
从字符串中提取特定部分,例如提取文件名的扩展名:
#include <iostream> #include <string> using namespace std; int main() { string filename = "example.txt"; size_t dot_pos = filename.find('.'); if (dot_pos != string::npos) { string extension = filename.substr(dot_pos + 1); cout << "Extension: " << extension << endl; // 输出:Extension: txt } else { cout << "No extension found." << endl; } return 0; }2. 分割字符串
将字符串分割成多个子字符串,例如按空格分割:
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string str = "Hello, World! This is a test."; vector<string> words; size_t start = 0, end = 0; while ((end = str.find(' ', start)) != string::npos) { words.push_back(str.substr(start, end - start)); start = end + 1; } words.push_back(str.substr(start)); for (const string& word : words) { cout << word << endl; } return 0; }注意事项
边界检查:
在调用
substr时,确保pos不超出字符串的范围,否则会抛出std::out_of_range异常。如果
len超出字符串的范围,substr会返回从pos开始到字符串末尾的子字符串。默认参数:
pos的默认值为0,表示从字符串的开头开始。
len的默认值为std::string::npos,表示从pos开始到字符串末尾。总结
std::string::substr是一个非常有用的函数,可以方便地从字符串中提取子字符串。通过指定起始位置和长度,可以灵活地处理字符串的切片操作。
1679

被折叠的 条评论
为什么被折叠?



