我一直在尝试使用java创建密码验证。密码验证的要求应为:
1)密码长度至少为六个字符。
2)密码至少应包含一个大写和小写。
3)密码至少应有一位数。
我已经完成了1和2,但我无法弄清楚3号。
我已经制作了一个布尔方法来检查字符是否有数字。据说,如果它能够找到一个数字,它将返回true,但即使我输入了一个带有数字的密码,它仍然返回false。
我想知道我的代码有什么问题。希望你们能帮助我。
int main() {
int counter = 0;
while (counter < 20) {
++counter;
}
return 0;
}
答案 0 :(得分:1)
您可以在每次迭代中设置状态,有效地覆盖除最后一个字符之外的任何真值。除此之外,您应该假设status = false
并在找到数字时将其设置为true。您的代码会考虑包含其他字符以及无效的任何密码。
示例:
pass = "1abcde"
status = true
1st iteration: char = 1 -> a digit, so status is not changed
2nd iteration: char = a -> not a digit, so status will be set to false
loop will break since status is false -> result: not valid
要解决这个问题,首先要假设status = false
并找到数字集status = true
。这样,当密码包含数字时,它将被视为有效。
示例:
status = false; //assume invalid password
for( char c : pass.toCharArray() ) {
if( Character.isDigit( c ) ) {
//found a digit
status = true;
//we're done since we found at least one digit
break;
}
}
return status;
但是,您的方法可以改进:
迭代字符并收集它们的特征(例如大写字母,小写字母,数字字符,特殊字符等)。然后检查特征的数量以及是否存在所需的特征。
示例:
enum CharTraits {
LOWER_CASE,
UPPER_CASE,
DIGIT,
SPECIAL
}
Set<CharTraits> getPasswordTraits( String pw ) {
Set<CharTraits> traits = new HashSet<>();
for( char c : pw.toCharArray() ) {
//better check for index of 0-9 otherwise you allow non-ascii digits as well
if( Character.isDigit( c ) ) {
traits.add( DIGIT );
}
else if ( Character.isUpperCase( c ) {
traits.add( UPPER_CASE);
}
... //the rest
}
return traits;
}
boolean isValid(String pass){
Set<CharTraits> traits = getPasswordTraits( String pass )
//Check for digits (just an example, you could check for more)
return traits.contains( DIGIT );
//if you want to check for 3 out of 4 just do this:
//return traits.size() >= 3;
}
答案 1 :(得分:0)
如果您的密码是abc123,则该方法会看到第一个字符,看到它没有数字,因此它设置了&#34; status&#34;为假。这就是为什么你的时间不会进入第二轮。状态必须是真实的。