B3843 密码合规

记录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;
	
} 

突破点

  1. 只能由 a∼z 之间 26 个小写字母、A∼Z 之间 26 个大写字母、0∼9 之间 10 个数字以及 !@#$ 四个特殊字符构成。

  2. 密码最短长度 :6 个字符,密码最大长度 :12 个字符。

  3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个

此类需要满足的要求,是if条件判断,进行信息分析与转化

提醒:一个字符只能是字母或者数字或者特殊字符,所以是多选一,由此想到else if类型

注意点:题目列了三个要求,但是共有四个条件,不要遗漏“以及至少有四个特殊字符中的一个”

思路

  1. 存进去输入的字符串,接着依次进行遍历(for循环)
  2. 将每的一段进行分割处理,对每一个字符进行判断并统计
  3. 识别到退出字符或者识别到'/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;
}

注意事项

  1. 边界检查

    • 在调用 substr 时,确保 pos 不超出字符串的范围,否则会抛出 std::out_of_range 异常。

    • 如果 len 超出字符串的范围,substr 会返回从 pos 开始到字符串末尾的子字符串。

  2. 默认参数

    • pos 的默认值为0,表示从字符串的开头开始。

    • len 的默认值为 std::string::npos,表示从 pos 开始到字符串末尾。

总结

std::string::substr 是一个非常有用的函数,可以方便地从字符串中提取子字符串。通过指定起始位置和长度,可以灵活地处理字符串的切片操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值