【问题标题】:Check whether the conditions for a password are met, but Pearson Revel says it's wrong检查是否满足密码条件,但 Pearson Revel 说错了
【发布时间】:2021-01-29 17:23:37
【问题描述】:

我正在为 C++ 家庭作业编写一个简单的程序,要求我们根据这 3 个条件显示密码是有效还是无效:

  • 密码必须至少包含八个字符
  • 密码仅由字母和数字组成
  • 密码必须至少包含两位数

当我提交作业时,它说它包含一个逻辑错误。但是,我已经检查了所有可能的输入情况,并且我的程序显示了正确性。下面是我的代码,谁能指出我的错误?

#include <iostream>
#include <cctype>
#include <string>
using namespace std;

int main() {
    cout << "Please enter a password: ";
    string password;
    cin >> password;

    bool isValid = true;
    if ( password.length() < 8 ) {
        isValid = false;
    }
    else {
        int numberOfDigits = 0;
        for ( int i = 0; i < password.length(); i++ ) {
            if ( !isalnum( password[i] ) ) {
                isValid = false;
                break;
            }
            if ( isdigit( password[i] ) ) {
                numberOfDigits++;
            }
        }
        if ( numberOfDigits < 2 ) {
            isValid = false;
        }
    }
    cout << ( isValid ? "Valid " : "Invalid " ) << "password" << endl;
    return 0;
}

【问题讨论】:

  • 对我来说看起来不错。不要以为你没有得到更多关于哪里出了问题的线索?
  • 对我来说看起来不错。我要说的唯一一点是isalnumisdigit 没有在负值上定义,所以严格来说你应该像isalnum( (unsigned char) password[i] ) 那样转换为unsigned char。如果这是问题所在,我会感到非常惊讶。

标签: c++ passwords


【解决方案1】:

您的逻辑是正确的,但问题是您没有阅读 Pearson Revel 中的空格。为此,请使用 std::getline(std::cin, password); 而不是 cin &gt;&gt; password;。这应该可以解决问题。

注意:密码仍然是错误的,因为它通过了第一个条件,但是第二个和第三个条件呢(看看第三个)。

另外,尽量不要使用using namespace std;,因为这不是一个好习惯。您所做的是将整个 std(即 huuuugeee)命名空间放入全局命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2021-04-25
    • 2023-02-09
    • 2018-04-11
    相关资源
    最近更新 更多