• C++
  • B3843 [GESP202306 三级] 密码合规

  • @ 2025-8-26 11:58:25

B3843 [GESP202306 三级] 密码合规

题目描述

网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。

  1. 只能由 az\texttt a \sim \texttt z 之间 2626 个小写字母、AZ\texttt A \sim \texttt Z 之间 2626 个大写字母、090 \sim 9 之间 1010 个数字以及 !@#$ 四个特殊字符构成。

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

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

输入格式

输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

输出格式

输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。

输入输出样例 #1

输入 #1

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

输出 #1

seHJ12!@
sjdkffH$123

说明/提示

【样例 1 解释】

输入被英文逗号分为了四组被检测密码:seHJ12!@sjdkffH$123sdf!@&12HDHa!123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。

4 条评论

  • @ 2025-8-26 12:02:19
    #include <iostream>
    #include <string>
    using namespace std;
    
    // 检查字符是否为合法字符
    bool isLegalChar(char c) {
        // 检查是否为小写字母
        if (c >= 'a' && c <= 'z') return true;
        // 检查是否为大写字母
        if (c >= 'A' && c <= 'Z') return true;
        // 检查是否为数字
        if (c >= '0' && c <= '9') return true;
        // 检查是否为允许的特殊字符
        if (c == '!' || c == '@' || c == '#' || c == '$') return true;
        // 其他字符均为非法
        return false;
    }
    
    // 检查密码是否符合所有要求
    bool is_valid(const string& pwd) {
        // 检查长度是否在6-12之间
        if (pwd.length() < 6 || pwd.length() > 12) {
            return false;
        }
        
        // 检查所有字符是否合法
        for (char c : pwd) {
            if (!isLegalChar(c)) {
                return false;
            }
        }
        
        // 统计各类字符的出现情况
        bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
        for (char c : pwd) {
            if (c >= 'a' && c <= 'z') {
                hasLower = true;
            } else if (c >= 'A' && c <= 'Z') {
                hasUpper = true;
            } else if (c >= '0' && c <= '9') {
                hasDigit = true;
            } else {
                hasSpecial = true;
            }
        }
        
        // 检查是否至少有一个特殊字符
        if (!hasSpecial) {
            return false;
        }
        
        // 检查是否至少有两种:大写字母、小写字母和数字
        int count = 0;
        if (hasLower) count++;
        if (hasUpper) count++;
        if (hasDigit) count++;
        
        return count >= 2;
    }
    
    int main() {
        string input;
        // 读取整行输入
        getline(cin, input);
        
        // 按逗号分割输入为多个密码
        size_t pos = 0;
        while (pos < input.length()) {
            size_t next = input.find(',', pos);
            string pwd;
            
            // 如果找到逗号,提取两个逗号之间的子串
            if (next != string::npos) {
                pwd = input.substr(pos, next - pos);
                pos = next + 1;
            } else {
                // 如果没找到逗号,提取剩余部分
                pwd = input.substr(pos);
                pos = input.length();
            }
            
            // 检查密码是否有效,如果有效则输出
            if (is_valid(pwd)) {
                cout << pwd << endl;
            }
        }
        
        return 0;
    }
    
    
    • @ 2025-8-26 12:02:08
      #include <iostream>
      #include <string>
      #include <vector>
      #include <algorithm>
      
      using namespace std;
      
      // 分割字符串为子串,以逗号为分隔符
      vector<string> split(const string &s) {
          vector<string> res;
          string temp;
          for (char c : s) {
              if (c == ',') {
                  res.push_back(temp);
                  temp.clear();
              } else {
                  temp += c;
              }
          }
          res.push_back(temp); // 添加最后一个子串
          return res;
      }
      
      // 检查字符是否为允许的特殊字符
      bool isSpecialChar(char c) {
          return c == '!' || c == '@' || c == '#' || c == '$';
      }
      
      // 检查密码是否合规
      bool isValidPassword(const string &password) {
          // 检查长度是否在6-12之间
          if (password.length() < 6 || password.length() > 12) {
              return false;
          }
          
          bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
          
          for (char c : password) {
              // 检查字符是否合法
              if (islower(c)) {
                  hasLower = true;
              } else if (isupper(c)) {
                  hasUpper = true;
              } else if (isdigit(c)) {
                  hasDigit = true;
              } else if (isSpecialChar(c)) {
                  hasSpecial = true;
              } else {
                  // 包含不允许的字符
                  return false;
              }
          }
          
          // 检查是否至少有一个特殊字符
          if (!hasSpecial) {
              return false;
          }
          
          // 检查是否至少有大写、小写和数字中的两种
          int count = 0;
          if (hasLower) count++;
          if (hasUpper) count++;
          if (hasDigit) count++;
          
          return count >= 2;
      }
      
      int main() {
          string input;
          getline(cin, input);
          
          vector<string> passwords = split(input);
          
          for (const string &pwd : passwords) {
              if (isValidPassword(pwd)) {
                  cout << pwd << endl;
              }
          }
          
          return 0;
      }
      
      
      • @ 2025-8-26 11:59:22
        #include<iostream>
        #include<vector>
        #include<string>
        using namespace std;
        
        // 检查密码是否只包含允许的字符
        // 允许的字符包括:大小写字母、数字以及!@#$四个特殊字符
        bool ok1(string str) {
            // 遍历密码中的每个字符
            for (char it : str) { // 基于范围的for循环,逐个访问字符串中的字符
                // 检查是否为小写字母
                if ('a' <= it && it <= 'z') {
                    continue; // 符合要求,继续检查下一个字符
                } 
                // 检查是否为大写字母
                else if ('A' <= it && it <= 'Z') {
                    continue; // 符合要求,继续检查下一个字符
                } 
                // 检查是否为数字
                else if ('0' <= it && it <= '9') {
                    continue; // 符合要求,继续检查下一个字符
                } 
                // 检查是否为允许的特殊字符
                else if (it == '!' || it == '@' || it == '#' || it == '$') {
                    continue; // 符合要求,继续检查下一个字符
                }
                // 如果以上条件都不满足,说明包含非法字符
                else {
                    return false;
                }
            }
            // 所有字符都检查通过
            return true;
        }
        
        // 检查密码长度是否在6-12个字符之间
        bool ok2(string str) {
            int len = str.size(); // 获取密码长度
            // 验证长度是否在合法范围内
            if (len >= 6 && len <= 12) {
                return true;
            } else {
                return false;
            }
        }
        
        // 检查密码是否满足字符类型要求:
        // 1. 大写字母、小写字母和数字中至少包含两种
        // 2. 至少包含一个特殊字符(!@#$)
        bool ok3(string str) {
            // 初始化标记变量,0表示不存在,1表示存在
            int da = 0,    // 大写字母标记
                xiao = 0,  // 小写字母标记
                shuzi = 0, // 数字标记
                teshu = 0; // 特殊字符标记
            
            // 遍历密码中的每个字符,检查字符类型
            for (char it : str) {
                if ('A' <= it && it <= 'Z') {
                    da = 1; // 标记存在大写字母
                }
                if ('a' <= it && it <= 'z') {
                    xiao = 1; // 标记存在小写字母
                }
                if ('0' <= it && it <= '9') {
                    shuzi = 1; // 标记存在数字
                }
                if (it == '!' || it == '@' || it == '#' || it == '$') {
                    teshu = 1; // 标记存在特殊字符
                }
            }
            
            // 检查是否满足条件:字母数字至少两种,且有特殊字符
            if (da + xiao + shuzi >= 2 && teshu == 1) {
                return true;
            } else {
                return false;
            }
        }
        
        int main() {
            string str;
            // 读取一行输入,包含多个用逗号分隔的密码
            getline(cin, str);
            // 在输入字符串末尾添加一个逗号,方便后续分割处理
            str += ',';
            
            // 用于存储分割后的各个密码
            vector<string> word;
        
            int left = 0; // 记录当前密码的起始位置
            int douHao;   // 记录逗号的位置
            
            // 分割字符串,提取各个密码
            while (true) {
                // 从left位置开始查找下一个逗号
                douHao = str.find(',', left);
                // 如果找不到逗号,说明所有密码都已提取完毕
                if (douHao == -1) {
                    break;
                }
                // 提取从left到逗号位置的子串,作为一个密码
                word.push_back(str.substr(left, douHao - left));
                // 更新下一个密码的起始位置
                left = douHao + 1;
            }
            
            // 检查每个密码是否合规,并输出合规的密码
            for (string it : word) {
                // 只有当三个条件都满足时,才是合规密码
                if (ok1(it) && ok2(it) && ok3(it)) {
                    cout << it << endl;
                }
            }
            
            return 0;
        }
        
        • @ 2025-8-26 11:58:35
          #include<iostream>
          #include<vector>
          #include<string>
          using namespace std;
          bool ok1(string str) {
          	//1、只能由 a∼z 之间 26 个小写字母、A∼Z 之间 26 个大写字母、0∼9 之间 10 个数字以及 !@#$ 四个特殊字符构成。
          	int cnt = 0;
          	int len = str.size();
          	for (char it : str) { //基于范围的for循环
          		if ('a' <= it && it <= 'z') {
          			cnt += 1;
          		} else if ('A' <= it && it <= 'Z') {
          			cnt += 1;
          		} else if ('0' <= it && it <= '9') {
          			cnt += 1;
          		} else if (it == '!' || it == '@' || it == '#' || it == '$') {
          			cnt += 1;
          		}
          	}
          	if (cnt == len) {
          		return true;
          	} else {
          		return false;
          	}
          }
          bool ok2(string str) {
          	//2、密码最短长度 :6 个字符,密码最大长度 :12 个字符。
          	int len = str.size();
          	if (len >= 6 && len <= 12) {
          		return true;
          	} else {
          		return false;
          	}
          }
          bool ok3(string str) {
          	//3、大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
          	int da = 0, xiao = 0, shuzi = 0, teshu = 0;
          	for (char it : str) { //基于范围的for循环
          		if ('A' <= it && it <= 'Z') {
          			da = 1;
          		}
          		if ('a' <= it && it <= 'z') {
          			xiao = 1;
          		}
          		if ('0' <= it && it <= '9') {
          			shuzi = 1;
          		}
          		if (it == '!' || it == '@' || it == '#' || it == '$') {
          			teshu = 1;
          		}
          	}
          	if (da + xiao + shuzi >= 2 && teshu == 1) {
          		return true;
          	} else {
          		return false;
          	}
          }
          int main() {
          	string str;
          	getline(cin, str);
          	str += ',';
          	//string word[200];
          	vector<string> word;
          
          	//find查找子串函数
          	//substr提取子串
          	int left = 0;//子串的起始下标
          	int douHao = -1;
          	while (1) {
          		douHao =  str.find(',', left);
          		if (douHao == -1) {
          			break;
          		}
          		//find("子串",开始查找到起始下标)
          		word.push_back(str.substr(left, douHao - left));
          		left = douHao + 1;
          	}
          	for (string it : word) { //基于范围的for循环
          		//cout<<it<<" "<<it.size()<<endl;
          		if (ok1(it) && ok2(it) && ok3(it)) {
          			cout << it << endl;
          		}
          	}
          	return 0;
          }
          
          • 1