我一直在研究这个问题无数个小时,我找不到问题所在。我改变并测试了问题的每个部分,总是得到奇怪和错误的结果。我开始认为我的编译器可能出现故障。
这就是我想要做的: 开发一个提示输入密码的程序,程序会检查是否满足以下条件。
至少6个字符。
至少包含一个大写字母。
至少包含一个小写字母。
至少包含一位数字。
如果输入的密码不符合标准,则程序应显示原因并提示重新输入。如果密码良好,则显示消息并结束程序。请帮忙!
注意:这是一个控制台32程序。
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <cctype>
#include "ctype.h"
using namespace std;
// Function prototype
bool lengthTest(char *);
bool lowCaseTest(char []);
bool upCaseTest(char []);
bool digitTest(char []);
const int SIZE = 20;
int main()
{
// Buffer to hold the string.
char password[SIZE];
int sumofbool;
// Program Intro Display
cout << "----PASSWORD VERIFIER PROGRAM----\n\n";
cout << "Enter a password that meets the following criteria:\n"
<< "-Minimum of 6 characters in length.\n"
<< "-Contains at least one uppercase and one lowercase letter.\n"
<< "-Contains at least one digit.\n\n";
cout << "->";
// Get input from user.
cin.getline(password, SIZE);
sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password)
+ digitTest(password);
// if 1 or more of the 4 functions is not true, display why and prompt for re-entry.
while (sumofbool < 4)
{
if (!lengthTest(password))
cout << "Error, password must be at least 6 characters long.\n";
if (!upCaseTest(password))
cout << "Error, password must contain at least one upper case letter.\n";
if (!lowCaseTest(password))
cout << "Error, password must contain at least one lower case letter.\n";
if (!digitTest(password))
cout << "Error, password must contain at least one digit.\n";
cout << "Please re-enter password: ";
// prompt for re-entry and call functions to test input.
cin.getline(password, SIZE);
sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
+ digitTest(password);
}
// if conditions for password are met, display message.
cout << "\nYou entered a valid password.\n\n";
return 0;
}
//*********LENGTH TEST FUNCTION***********
bool lengthTest(char *str)
{
int numChar = 0;
bool validlength = false;
for (int cnt = 0; cnt < SIZE; cnt++)
{
while (*str != 0)
str++, numChar++;
}
if (numChar >= 6)
validlength = true;
return validlength;
}
//*********LOWERCASE LETTER TEST FUNCTION*********
bool lowCaseTest(char pass[])
{
for (int cnt = 0; cnt < SIZE; cnt++)
{
if (islower(pass[cnt]))
return true;
}
return false;
}
//********CAPITAL LETTER TEST FUNCTION*********
bool upCaseTest(char pass[])
{
for (int cnt = 0; cnt < 20; cnt++)
{
if (isupper(pass[cnt]))
return true;
}
return false;
}
//**********DIGIT TEST FUNCTION************
bool digitTest(char pass[])
{
for (int cnt = 0; cnt < 20; cnt++)
{
if (isdigit(pass[cnt]))
return true;
}
return false;
}
答案 0 :(得分:1)
行中有一个额外的分号
sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
+ digitTest(password);
(哇,需要一段时间才能发现。)解决这个问题应解决长度问题。
我也认为:
for (int cnt = 0; cnt < SIZE; cnt++)
{
while (*str != 0)
str++, numChar++;
}
可以缩短为
while (*str != 0)
str++, numChar++;
,虽然这不会改变功能。前者只计算长度,然后SIZE - 1
次迭代就什么都不做。
此外,正如评论中提到的BenTrofatter,每次测试字符串时,您都会检查SIZE
个字符数。如果字符串短于SIZE
,则您不知道在字符串长度之后您正在访问的内存。
由于你把它标记为C ++,我会说像MarceloCantos提到的那样使用C ++字符串。它们通常更容易使用,从传递参数到访问子串。
答案 1 :(得分:0)
lengthTest()
strlen(str)
中的所有内容
strlen()
作为循环终止条件,而不是您现在拥有的任何硬编码值while (*str != 0) str++
- 每次因为逃跑指针和内存损坏问题,这都会让你陷入困境另外,我肯定会用一次运行替换同一个字符串上的多次运行:
bool has_uppers = false, has_lowers = false, has_digits = false;
int length = strlen(password);
for( int i=0; i<length; i++) {
char ch = password[i];
has_uppers |= isupper(ch);
has_lowers |= islower(ch);
has_digits |= isdigit(ch);
}