前言:我犯了一个简单的错误,有一个'>'什么时候我应该有一个'<'仍然是很好的学习经验和小问题导致问题的例子,并且调试结果很奇怪。
提前感谢您的帮助。
我正在编写一个小程序来检查密码标准。我必须确保密码符合以下最低要求: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;
}
答案 0 :(得分:2)
错字
for (int i = 0; i > stringLength; i++)
应该是
for (int i = 0; i < stringLength; i++)