1 条题解

  • 3
    @ 2024-4-27 19:40:45

    【题目大意】

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

    【考纲知识点】

    多层分支/循环结构(二级),模拟法、字符串(三级)

    【解题思路】

    1. 首先遍历输入的字符串 line 并按照','进行分隔。

    2. 对于分隔出来的每一个密码,先判断密码长度是否符合要求,然后遍历所有 的字符,并用 hasC,hasL,hasD,hasS 分别记录是否存在大写字母,小写字母,数字以及特殊字符,若存在以上四种字符外的其它字符则直接返回非法。

    3. 判断是否存在特殊字符,若不存在返回非法。

    4. 判断是否存在两种及以上的大写字母、小写字母和数字,若不存在返回非法。

    5. 以上情况都存在,返回合法并输出。

    【参考程序】

    #include <iostream>
    using namespace std;
    char line[101];
    char pwd[101];
    // 检查从 str 开始、长度为 l 的密码是否合规
    bool check(char * str, int l) {
    	if (l < 6 || l > 12)
    		return false;
    	bool hasC = false, hasL = false, hasD = false, hasS = false;
    	for (int i = 0; str[i] != '\0'; i++) {
    		if ('A' <= str[i] && str[i] <= 'Z') {
    			hasC = true;
    		} else if ('a' <= str[i] && str[i] <= 'z') {
    			hasL = true;
    		} else if ('0' <= str[i] && str[i] <= '9') {
    			hasD = true;
    		} else if (str[i] == '!' || str[i] == '@' ||str[i] == '#' || str[i] == '$') {
    			hasS = true;
    		} else
    		return false;
    	}
    	if (!hasS)
    		return false;
    	if (hasC + hasL + hasD < 2)
    		return false;
    	return true;
    }
    int main() {
    	cin >> line;
    	// 按逗号对输入进行切分,并依次判断
    	int len = 0;
    	for (int i = 0; line[i] != '\0'; i++) {
    		if (line[i] != ',') {
    			pwd[len] = line[i];
    			len++;
    		} else {
    			pwd[len] = '\0';
    			if (check(pwd, len))
    				cout << pwd << endl;
    			len = 0;
    		}
    	}
    	if (len > 0) {
    		pwd[len] = '\0';
    		if (check(pwd, len))
    			cout << pwd << endl;
    	}
    	return 0;
    }
    
    • 1

    [GESP202306 三级] 密码合规

    信息

    ID
    564
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    246
    已通过
    52
    上传者