C++ 如何检查字符串是否包含以下所有内容:数字、字母和特殊字符?

C++ 如何检查字符串是否包含以下所有内容:数字、字母和特殊字符?,c++,C++,我正在尝试构建一个简单的密码验证程序: 程序打印 如果密码少于8个字符和所有数字,“非常弱” 如果密码少于8个字符和所有字母,则为“弱” 如果密码包含8个或更多字符,并且包含数字和字母,则为“Strong” 如果密码包含8个或更多字符,并且包含数字、字母和特殊字符,则为“非常强” 如您所见,我知道如何检查字符串是否有三种类型的字符之一。 如何检查字符串是否有两个或全部三个 #include <iostream> #include <ctype.h> #include

我正在尝试构建一个简单的密码验证程序:

程序打印

  • 如果密码少于8个字符和所有数字,“非常弱”

  • 如果密码少于8个字符和所有字母,则为“弱”

  • 如果密码包含8个或更多字符,并且包含数字和字母,则为“Strong”

  • 如果密码包含8个或更多字符,并且包含数字、字母和特殊字符,则为“非常强”

如您所见,我知道如何检查字符串是否有三种类型的字符之一。 如何检查字符串是否有两个或全部三个

#include <iostream>
#include <ctype.h>
#include <cstring>

int main()
{
    std::cout << "Enter your new password: ";
    std:: string password{};
    std::cin >> password;

    bool veryweak;
    bool weak;
    bool strong;
    bool verystrong;

    if (password.length() < 8)
    {
        for (int i = 0; i < password.length(); i++)
            {
                if (isdigit(password[i]))
                {
                    veryweak = true;
                }

                else if (isalpha(password[i]))
                {
                    weak = true;
                }
            }
    }

    else if (password.length() >= 8)
    {
        for (int i = 0; i < password.length(); i++)
        {
            //if (password has digits and alphabets)
                //strong = true;

            //if (password has digits and alphabet and special characters)
                //verystrong = true;
        }
    }

    else
    {
        std::cout << "Password is invalid.";
    }
    //---------------------------------------------------------------------------------------------------------------------
    if (veryweak)
    {
        std::cout << "Your password is very weak.";
    }

    else if (weak)
    {
        std::cout << "Your password is weak.";
    }

    else if(strong)
    {
        std::cout << "Your password is strong.";
    }

    else if (verystrong)
    {
        std::cout << "Your password is very strong.";
    }

    return 0;
}

#包括
#包括
#包括
int main()
{
std::cout>密码;
布尔·韦里韦克;
布尔弱;
布尔斯特朗;
布尔·维里斯特朗;
if(password.length()<8)
{
对于(int i=0;i=8)
{
对于(int i=0;istd::cout为什么不使用一些计数器,比如弱点计数器之类的。对于每个满足的属性,计数器都会增加一个。最后,您会检查满足了多少属性,并在此之后对密码强度进行评分

此外,我建议您为每个属性编写自己的函数,如:

bool containsNumbers(string pw);
bool containsLetters(string pw);
在这种情况下,通过新属性等更容易阅读、更改和扩展代码

我希望我能帮助你


问候:)

我想介绍一下布尔人:

  • 短密码
  • 容器数量
  • 容器性输卵管炎
  • 包含特殊字符
你写不出来

std::string passwortStrengt () {
    if (isShortPassword && !containsAlphabet && !containsSpecialCharacters) {
        return "weak";
    //forumlate all cases as you did in prosa up above
    } else if (...) {
    } else if (...) {
    } 
    return "weak"; // just in case you missed a case above
}

您可以为每种类型(3种类型)使用一个布尔返回函数,然后使用ifFirst check检查所需内容,然后检查字符,然后检查特殊字符您的“非常弱”和“弱”检测被破坏。如果任何字符都符合条件,则会触发短密码,而不是所有字符都符合条件。事实上,在循环完成后,您可以很容易地看到密码既弱又非常弱,而实际上两者都不是。坦率地说,您缺少了一个核心状态:少于8个字符。仅此一项就应该具有唯一的状态。我建议解释编辑您的代码。感谢您的更正/建议。我意识到问题在于程序设计。实际上,我可以通过更改密码验证方式来解决这个问题,正如@schorsch312和@J W所建议的那样,使用我已经知道的方法。@PraveenGunasekaran提示:!(isdigit | isalpha)可能值得研究。