c++ - For循环不执行

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

前言:我犯了一个简单的错误,在我应该有一个 '<' 的时候却有一个 '>'。尽管如此,还是有很好的学习经验和示例,说明小事如何导致问题,并产生奇怪的调试器结果。

提前感谢您的帮助。

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

我的“isUpperCase”函数一直返回一个 bool 假值因为 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;
}

最佳答案

错别字

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

应该是

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

关于c++ - For循环不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747276/

相关文章:

java - 为什么\n 和 (String)System.getProperty ("line.separator");采取不同的行动?

java - 为什么键盘给出的循环迭代范围将自身算作一次迭代?

Java 查找某个字符出现次数的方法

c++ - vptr的解析

c++ - 使继承的成员静态化

c++ - 访问私有(private)变量的单元测试

c++ - 在单独的线程中调用 boost::python::object 作为函数

c++ - 派生类无法访问继承的函数?

c++ - 如何读取视频元数据(C/C++)?

c++ - 在 C++ 中使用 pthread