判断字符串包含字母,数字,特殊符号
本文最后更新于538 天前,其中的信息可能已经过时,如有错误请发送邮件到898599301@qq.com

使用c++11新特性:any_of

1.1函数原型:

template<class InputIt, class UnaryPredicate>
bool any_of(InputIt first, InputIt last, UnaryPredicate p);

参数解释

  1. InputIt first
  • 这是输入范围的起始迭代器,指向要检查的第一个元素。
  1. InputIt last
  • 这是输入范围的结束迭代器,指向要检查的最后一个元素之后的位置(即范围是 [first, last))。
  1. UnaryPredicate p
  • 这是一个一元谓词函数或函数对象,用于对范围内的每个元素进行检查。谓词函数接受一个元素作为参数,并返回一个布尔值,表示该元素是否满足特定条件。

关于第三个参数的使用

  1. 使用标准库函数
  2. 使用 lambda 表达式
  3. 使用函数指针
  4. 使用函数对象

返回值

  • 如果范围内至少有一个元素满足谓词函数 p,则返回 true
  • 否则,返回 false

1.2参数示例

#include <iostream>
#include <vector>
#include <algorithm> // 包含 any_of
#include <cctype> // 包含 isdigit 和 isalpha

using namespace std;

// 自定义函数对象
struct IsSpecialChar {
    bool operator()(char c) const {
        return !isalnum(c); // 非字母和数字的字符即为特殊字符
    }
};

// 自定义函数
bool isSpecialChar(char c) {
    return !isalnum(c);
}

int main() {
    string str = "Hello123!";
    // 使用标准库函数
    bool hasDigit = any_of(str.begin(), str.end(), ::isdigit);
    if (hasDigit) {
        cout << "String contains a digit." << endl;
    } else {
        cout << "String does not contain any digit." << endl;
    }

    // 使用 lambda 表达式
    bool hasAlpha = any_of(str.begin(), str.end(), [](char c) {
        return isalpha(c);
    });
    if (hasAlpha) {
        cout << "String contains a letter." << endl;
    } else {
        cout << "String does not contain any letter." << endl;
    }

    // 使用函数指针
    bool hasSpecialChar1 = any_of(str.begin(), str.end(), isSpecialChar);
    if (hasSpecialChar1) {
        cout << "String contains a special character (using function pointer)." << endl;
    } else {
        cout << "String does not contain any special character (using function pointer)." << endl;
    }

    // 使用函数对象
    bool hasSpecialChar2 = any_of(str.begin(), str.end(), IsSpecialChar());
    if (hasSpecialChar2) {
        cout << "String contains a special character (using function object)." << endl;
    } else {
        cout << "String does not contain any special character (using function object)." << endl;
    }

    return 0;
}

1.3题目示例

根据复杂程度不同,密码安全度被分为高、中、低三档。

  • 高:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,同一个字符出现不超过 2 次;
  • 中:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,且未达到高安全度要求;
  • 低:由上述 64 种字符组成,长度大于等于 6 个字符,且未达到中安全度要求;

小 P 为自己准备了 n 个候选密码,试编写程序帮小 P 自动判别每个密码的安全级别。保证这 nn 个密码都至少满足低安全度要求,当安全度为高、中、低时分别输出 210 即可。

输入

  • 从标准输入读入数据。
  • 输入共 n+1 行。
  • 第一行包含一个正整数 n,表示待判别的密码个数;
  • 接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。

输出

  • 输出到标准输出。
  • 输出共 n 行,每行输出一个整数 210,表示对应密码的安全度。

代码

#include <bits/stdc++.h>

using namespace std;

// 判断字符串是否符合特定条件
int judge(string s) {
    // 检查字符串是否包含 '#' 或 '*',并且包含数字和字母
    if ((s.find("#") != string::npos || s.find("*") != string::npos) && 
        any_of(s.begin(), s.end(), ::isdigit) && 
        any_of(s.begin(), s.end(), ::isalpha)) {

        // 检查字符串中是否有任何字符出现超过两次
        for (int i = 0; i < s.size(); i++) {
            if (count(s.begin(), s.end(), s[i]) > 2)
                return 1; // 如果有字符出现超过两次,返回 1
        }
        return 2; // 如果没有字符出现超过两次,返回 2
    } else {
        return 0; // 如果不符合包含 '#' 或 '*',数字和字母的条件,返回 0
    }
}

int main(int argc, char const *argv[]) {
    int n;
    cin >> n; // 读取需要判断的字符串总数
    string str;
    while (n--) {
        cin >> str; // 读取需要判断的字符串
        cout << judge(str) << endl; // 输出判断结果
    }
    return 0;
}

题目来源:TUOJ

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇