C++ 从C++;,密码验证器
我已经在这个问题上工作了无数个小时,但我找不到问题所在。我改变并测试了问题的每个部分,总是得到奇怪和错误的结果。我开始觉得我的编译器可能出了故障 这就是我想做的: 开发一个提示输入密码的程序,该程序检查是否满足以下条件 至少6个字符长 至少包含一个大写字母 至少包含一个小写字母 至少包含一个数字 如果输入的密码不符合条件,则程序应显示原因并提示重新输入。如果密码正确,则会显示一条消息并结束程序。请帮忙 注意:这是一个控制台32程序C++ 从C++;,密码验证器,c++,C++,我已经在这个问题上工作了无数个小时,但我找不到问题所在。我改变并测试了问题的每个部分,总是得到奇怪和错误的结果。我开始觉得我的编译器可能出了故障 这就是我想做的: 开发一个提示输入密码的程序,该程序检查是否满足以下条件 至少6个字符长 至少包含一个大写字母 至少包含一个小写字母 至少包含一个数字 如果输入的密码不符合条件,则程序应显示原因并提示重新输入。如果密码正确,则会显示一条消息并结束程序。请帮忙 注意:这是一个控制台32程序 #包括“stdafx.h” #包括 #包括 #包括 #包括“ct
#包括“stdafx.h”
#包括
#包括
#包括
#包括“ctype.h”
使用名称空间std;
//功能原型
布尔长度测试(字符*);
bool-lowCaseTest(char[]);
bool-upCaseTest(char[]);
bool-digitTest(char[]);
常数int SIZE=20;
int main()
{
//缓冲区来保存字符串。
字符密码[大小];
int sumofbool;
//程序介绍显示
行中可以多加一个分号吗
sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
+ digitTest(password);
(哇,这花了一段时间才发现。)解决这个问题应该可以解决长度问题
我还认为:
for (int cnt = 0; cnt < SIZE; cnt++)
{
while (*str != 0)
str++, numChar++;
}
,虽然这不会改变功能。前者只计算长度,而对于SIZE-1
迭代则什么也不做
此外,正如BenTrofatter在评论中提到的,每次测试字符串时都要检查SIZE
字符数。如果字符串短于SIZE
,则不知道在字符串长度之后要访问什么内存
<>你把这个标记为C++,我会说,像MarceloCantos提到的那样,用C++字符串。一般来说,从传递参数到访问子串更容易。 行中的额外分号
sumofbool = lengthTest(password) + lowCaseTest(password) + upCaseTest(password);
+ digitTest(password);
(哇,这花了一段时间才发现。)解决这个问题应该可以解决长度问题
我还认为:
for (int cnt = 0; cnt < SIZE; cnt++)
{
while (*str != 0)
str++, numChar++;
}
,虽然这不会改变功能。前者只计算长度,而对于SIZE-1
迭代则什么也不做
此外,正如BenTrofatter在评论中提到的,每次测试字符串时都要检查SIZE
字符数。如果字符串短于SIZE
,则不知道在字符串长度之后要访问什么内存
<>你把这个标记为C++,我会说,像MarceloCantos提到的那样,用C++字符串。一般来说,从传递参数到访问子串更容易。
不要尝试对布尔值求和
用对strlen(str)
strlen()
作为循环终止符条件,而不要使用任何硬编码的值——这会因为指针跑掉和内存损坏问题每次都咬到你的屁股
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);
}
bool的上限为false,下限为false,数字为false;
int length=strlen(密码);
对于(int i=0;i
不要尝试对布尔值求和
用对strlen(str)
strlen()
作为循环终止符条件,而不要使用任何硬编码的值——这会因为指针跑掉和内存损坏问题每次都咬到你的屁股
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);
}
bool的上限为false,下限为false,数字为false;
int length=strlen(密码);
对于(int i=0;我开始认为可能我的编译器出现了故障。几乎所有的迹象都表明你出现了故障,是时候散散步或睡一觉了。举一个失败的例子。然后就很容易进行反向工程。我感觉这与程序正在测试大小字符有关传入的每个字符串中都有一个字符,但不能保证该字符串的长度为大小字符。一旦达到空字符,就应该停止测试,否则我认为您可能会遇到未定义的行为。当开始使用新的编程语言时,“编译器可能会崩溃”事实上,即使你已经使用了20年,它仍然应该是一个很长的检查表上的最后一个理论。另外一个注意事项,你是写这个代码来学习编程还是学习C++?我问是因为<代码>长度测试< /Cuff>函数是不必要的;<代码> LangTestTest[密码]
可以替换为strlen(password)>=6
,其他测试也可以使用类似的简化方法。此外,您应该读入std::string
,而不是char[SIZE]
。我开始认为可能是我的编译器出现了故障。几乎所有的迹象都表明你出现了故障,是时候散散步或睡一觉了。举一个失败的例子。这样就很容易进行反向工程。我觉得这与程序正在测试大小字符这一事实有关在传入的每个字符串中,不保证字符串的长度为大小字符。一旦达到空字符,这将真正停止测试,否则