For循环不执行

时间:2015-11-17 00:44:32

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

前言:我犯了一个简单的错误,有一个'>'什么时候我应该有一个'<'仍然是很好的学习经验和小问题导致问题的例子,并且调试结果很奇怪。

提前感谢您的帮助。

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

我的" isUpperCase"函数继续返回布尔值false ,因为 for循环没有执行。在我的调试器中,for循环的索引取值I而不分配它。虽然我正在写作,但它的价值为2065172704并立即失败:

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

这篇文章中唯一的功能是" main," " passwordFailMessage," " isGreaterThanSix,"和#34; 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;
}

1 个答案:

答案 0 :(得分:2)

错字

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

应该是

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