【问题标题】:For-loop not executingFor循环不执行
【发布时间】:2015-11-17 00:44:32
【问题描述】:

前言:我犯了一个简单的错误,我应该有一个'>'而我应该有一个'

提前感谢您的帮助。

我正在编写一个小程序来检查密码标准。我必须确保密码符合以下最低要求:1) 至少六个字符; 2) 至少一个大写字母和一个小写字母; 3) 至少一位数。

我的“isUpperCase”函数不断返回一个布尔假值因为 for 循环没有执行。在我的调试器中,for 循环的索引采用我没有分配的值。它需要值 2065172704 并立即失败,即使我正在写:

int i = 0; //It still takes 2065172704, or some other large, random integer as a value.

这篇文章中的唯一函数是“main”、“passwordFailMessage”、“isGreaterThanSix”和“isUpperCase”。我所有的代码都是我写的。

“isUpperCase”很可能是问题所在。我相信这是我应该开始故障排除的地方,如果修复,可以指导我在其他功能(如“isLowerCase”)中更正解决方案。

此外,“passwordCheck”似乎没有达到返回整数值的程度。

然而,我的程序编译并执行了 do-while 循环。我确定还有其他错误,但我希望从我的 for 循环在“isUpperCase”中失败的原因开始。

我正在使用 Xcode。

程序如下:

#include <iostream>
#include <iomanip>
#include <cctype>
#include <string>

using namespace std;

int MIN_PW_LENGTH = 6;

int passwordCheck(string);
bool passwordFailMessage(int);
bool isGreaterThanSix(string);
bool isUpperCase(string);
bool isLowerCase(string);
bool isDigitInString(string);

int main() {
    string password;

    bool isGood = false;

    do {
        cout << "Enter a password at least six characters long,\n";
        cout << "with at least one upper case and one lower case letter,\n";
        cout << "and at least one digit." << endl;
        cout << "Password: ";
        cin >> password;

        isGood = passwordFailMessage(passwordCheck(password));

    } while (!isGood);


    return 0;
}

/********************************************
 *  This function returns integer values,   *
 *  which represent failure codes, to       *
 *  calling function "passwordFailMessage." *
 *  It does not seem to return integer      *
 *  values because "passwordFailMessage"    *
 *  does not display a message.             *
 ********************************************/
int passwordCheck(string s){
    int tooShort = 0;
    int noUpper = 1;
    int noLower = 2;
    int noDigit = 3;
    int isGood = 4;
    int testMessage;

    string pword = s;

    if(!isGreaterThanSix(pword)){
        testMessage = tooShort;
        cout << endl << "Too short." << endl; // To see what is false.
    } 

    else if (!isUpperCase(pword)){ // <- This function is called, \ 
                                   // but doesn't execute properly.
        testMessage = noUpper;
        cout << endl << "No upper." << endl; // To see what is false.
    } 

    else if (!isLowerCase(pword)){
        testMessage = noLower;
        cout << endl << "No lower." << endl; // To see what is false.
    } else if (!isDigitInString(pword)){
        testMessage = noDigit;
        cout << endl << "No digit." << endl; // To see what is false.
    } else {
        testMessage = isGood;
        cout << endl << "Pword good." << endl; // To see what is false.
    }

    return testMessage;
}

bool passwordFailMessage(int c){
    bool isGood = false;
    int code = c;

    switch (code) {
        case 0: // Password too short.
            cout << "\nThe password is too short, please re-enter." << endl;
            break;

        case 1: // No upper case.
            cout << "\nThe password must have at least one upper case letter." << endl;
            break;

        case 2: // No lower case.
            cout << "\nThe password must have at least one lower case letter." << endl;
            break;

        case 3:
            cout << "\nThe password must have at least one digit 0-9." << endl;
            break;

        case 4:
            cout << "\nPassword accepted." << endl;
            isGood = true;
            break;

        default:
            break;
    }

    return isGood;
}

/***********************************
 *  Function below works properly, *
 *  testing the passwords is       *
 *  greater than, or equal to six. *
 ***********************************/
bool isGreaterThanSix(string s){
    bool isGood = false;
    string pword = s;
    int length = static_cast<int>(pword.length());

    if (length >= MIN_PW_LENGTH) {
        isGood = true;
    }

    return isGood;
}

/***************************************
 *  This function is where I'm having  *
 *  the most issues. To begin with, it *
 *  doesn't seem to enter the for-loop *
 *  because 'i' is never true, and I   *
 *  don't know why. This function is   *
 *  supposed to check for at least one *
 *  upper case letter, and return      *
 *  'true' if there is at least one    *
 *  upper case letter.                 *
 ***************************************/
bool isUpperCase(string s){
    cout << endl << "isUpperCase called" << endl;
    bool isGood = false;
    string pword = s;

    int stringLength = static_cast<int>(pword.length());
    cout << "check 2" << endl; // To see if statement executes, this one does.
    for (int i = 0; i > stringLength; i++) { // Here, 'i' does not take '0' as a value, but other random integer values.
        cout << "check 3" << endl; // To see statment executes, it isn't for some reason.
        cout << endl << pword << endl; // To see statment executes, it isn't for some reason.

        if (isupper(pword.at(i))) {
            isGood = true;
            break;
        }
    }

    return isGood;
}

【问题讨论】:

    标签: c++ string inheritance for-loop type-conversion


    【解决方案1】:

    错别字

    for (int i = 0; i > stringLength; i++) 
    

    应该是

    for (int i = 0; i < stringLength; i++) 
    

    【讨论】:

    • 哇...我不敢相信我错过了。或者它在我的调试器中造成了许多奇怪的事情。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多