2015-11-17 164 views
0

前言:我犯了一个简单的错误,当我有一个'>'时应该有'<'。仍然有很好的学习经验和很少的事情导致问题的例子,并且具有奇怪的调试结果。For循环未执行

非常感谢您的帮助。

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

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

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

在这个岗位的唯一功能是“主”,“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; 
} 

回答

2

错字

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

应该

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

哇...我无法相信我错过了。或者它在我的调试器中引起了许多奇怪的事情。谢谢 – NonCreature0714