如何检查一个字符串是否包含数字、字母和特殊字符?

3

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

程序输出:

  • 如果密码少于8个字符并且全部为数字,则输出"非常弱"。

  • 如果密码少于8个字符并且全部为字母,则输出"弱"。

  • 如果密码包含8个或更多字符,并且同时包含数字和字母,则输出"强"。

  • 如果密码包含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;
}


你可以为它们中的每一个(3种类型)编写一个带布尔型返回值的函数,然后使用 if 语句检查你需要的内容。 - samini
首先检查字符,然后检查特殊字符。 - Thomas Sablik
你的“非常弱”和“弱”密码检测有问题。如果任何一个字符符合条件,它就会触发短密码检测,而不是要求所有字符都符合条件。实际上,在循环结束后,你可以很容易地看到一个密码既弱又非常弱,但事实上它既不是弱密码也不是非常弱密码。坦白地说,你缺少了一个核心状态:只有少于8个字符。这本身就应该有一个独特的状态。我建议你向你的橡皮鸭子解释你的代码。 - WhozCraig
感谢您的更正/建议。我意识到问题出在程序设计上。实际上,我可以通过改变密码验证的方式来解决这个问题,就像@schorsch312和@J W建议的那样,使用我已经知道的方法。 - Praveen Gunasekaran
然而,如果有人能帮我如何专门检查特殊字符(C++中是否有类似于isdigit()或isalpha()的函数),那将是令人惊奇的。 - Praveen Gunasekaran
1
@PraveenGunasekaran 提示:值得研究的是 !(isdigit || isalpha)。 - WhozCraig
2个回答

0

为什么不使用一些计数器,比如weakness_counter之类的。对于每个被满足的属性,计数器都会增加一。最后,您可以检查有多少属性被满足,并在此基础上评估密码强度。

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

bool containsNumbers(string pw);
bool containsLetters(string pw);

等等。在这种情况下,通过新属性等更容易阅读、更改和扩展代码。

我希望我能帮到你。

问候 :)


0

我将介绍布尔值:

  • isShortPassword(密码是否过短)
  • containsNumbers(是否包含数字)
  • containsAlphabet(是否包含字母)
  • containsSpecialCharacters(是否包含特殊字符)

然后你可以编写:

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接