问题
Problem Description:
Some Websites impose certain rules for passwords. Write a method that checks whether a string is a valid password. Suppose the password rule is as follows:
- A password must have at least eight characters.
- A password consists of only letters and digits.
- A password must contain at least two digits.
Write a program that prompts the user to enter a password and displays "valid password" if the rule is followed or "invalid password" otherwise.
This is what I have so far:
import java.util.*;
import java.lang.String;
import java.lang.Character;
/**
* @author CD
* 12/2/2012
* This class will check your password to make sure it fits the minimum set requirements.
*/
public class CheckingPassword {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Please enter a Password: ");
String password = input.next();
if (isValid(password)) {
System.out.println("Valid Password");
} else {
System.out.println("Invalid Password");
}
}
public static boolean isValid(String password) {
//return true if and only if password:
//1. have at least eight characters.
//2. consists of only letters and digits.
//3. must contain at least two digits.
if (password.length() < 8) {
return false;
} else {
char c;
int count = 1;
for (int i = 0; i < password.length() - 1; i++) {
c = password.charAt(i);
if (!Character.isLetterOrDigit(c)) {
return false;
} else if (Character.isDigit(c)) {
count++;
if (count < 2) {
return false;
}
}
}
}
return true;
}
}
When I run the program it only checks for the length of the password, I cannot figure out how to make sure it is checking for both letters and digits, and to have at least two digits in the password.
回答1:
You almost got it. There are some errors though:
- you're not iterating over all the chars of the password (
i < password.length() - 1
is wrong) - you start with a digit count of 1 instead of 0
- you make the check that the count of digits is at least 2 as soon as you meet the first digit, instead of checking it after you have scanned all the characters
回答2:
Suppose a valid password has:
- 8 or more characters, but not more than 16 characters
- one or more uppercase characters
- one or more lowercase characters
- one or more digits
- one or more special characters (like $, @, or !)
Code:
import java.util.Scanner;
public class Password {
public static void main(String[] args) {
// TODO Auto-generated method stub
int min =8;
int max=16;
int digit=0;
int special=0;
int upCount=0;
int loCount=0;
String password;
Scanner scan = new Scanner(System.in);
System.out.println(" Enter Your Password:");
password = scan.nextLine();
if(password.length()>=min&&password.length()<=max){
for(int i =0;i<password.length();i++){
char c = password.charAt(i);
if(Character.isUpperCase(c)){
upCount++;
}
if(Character.isLowerCase(c)){
loCount++;
}
if(Character.isDigit(c)){
digit++;
}
if(c>=33&&c<=46||c==64){
special++;
}
}
if(special>=1&&loCount>=1&&upCount>=1&&digit>=1){
System.out.println(" Password is good:");
}
}
if(password.length()<min){
for(int i =0;i<password.length();i++){
char c = password.charAt(i);
if(Character.isLowerCase(c)){
loCount++;
}
}
if(loCount>0){
System.out.println(" Password must be atleat "+min+" characters:");
System.out.println(" You need atleast one upper case chracter:");
System.out.println(" You need atleast one digit:");
System.out.println(" You need atleast one special chracter:");
}
}
else if(password.length()<min&&upCount>1){
for(int i =0;i<password.length();i++){
char c =password.charAt(i);
if(Character.isLowerCase(c)){
loCount++;
}
if(Character.isUpperCase(c)){
upCount++;
}
}
if(loCount>0&&upCount>0){
System.out.println(" Password must be atleast "+min+" chracters:");
System.out.println(" You need atleast one digit:");
System.out.println(" You need atleast one special chracter:");
}
}
if(password.length()>max||password.length()>=max&&upCount>1&&loCount>1&&digit>1){
System.out.println(" Password is too long.Limit is "+max+" chracters:");
System.out.println(" You need atleast one special chracter:");
}
if(password.length()>=min&&password.length()<=max&&loCount>0&&upCount>0&&digit>0&&special==0){
System.out.println(" You need atleast a special chracter");
}
if(password.length()>=min&&password.length()<=max&&loCount>0&&upCount>0&&digit==0&&special==0){
System.out.println(" You need atleast one digit:");
System.out.println(" You need atleast one special chracter:");
}
}
}
回答3:
As previously answered, you should chek all the password characters first. Count your digits and finally check if count is smaller than 2. Here is the referring code.
if (password.length() < 8) {
return false;
} else {
char c;
int count = 0;
for (int i = 0; i < password.length(); i++) {
c = password.charAt(i);
if (!Character.isLetterOrDigit(c)) {
return false;
} else if (Character.isDigit(c)) {
count++;
}
}
if (count < 2) {
return false;
}
}
return true;
}
回答4:
public void run()
{
String password= readLine("Insert Password: ");
boolean len= true;
boolean letter= true;
boolean twodig= true;
if (password.length() < 8) {
len = false;
} else {
char c;
int count = 0;
for (int i = 0; i < password.length(); i++) {
c = password.charAt(i);
if (!Character.isLetterOrDigit(c)) {
letter = false;
} else if (Character.isDigit(c)) {
count++;
}
}
if (count < 2) {
twodig = false;
}
}
if(len ==true && letter == true && twodig == true)
{
System.out.println("This password is valid ");
}
else
{
System.out.println("This password is invalid");
}
}
回答5:
package Method;
/* 2. Write a Java method to check whether a string is a valid password. Password rules: A password must have at least ten characters. A password consists of only letters and digits. A password must contain at least two digits.
Expected Output:
- A password must have at least eight characters.
- A password consists of only letters and digits.
- A password must contain at least two digits
Input a password (You are agreeing to the above Terms and Conditions.): abcd1234
Password is valid: abcd1234 */
public class CheckPassword {
public static String password;
public static int disitCounter = 0;
public static boolean isValid(String password) {
if (password.length() >= 10 ) {
for(int index = 0; index < password.length(); index++) {
char passChar = password.charAt(index);
if (!Character.isLetterOrDigit(passChar)) {
return false;
}
else {
if (Character.isDigit(passChar)) {
disitCounter++;
}
}
}
}
if(disitCounter < 2) {
return false;
}
return true;
}
public static void main(String[] args) {
password = "abcdefgh1w3";
if(isValid(password)) {
System.out.print("It is a valid password");
}
else {
System.out.print("It is a invalid password");
}
}
}
回答6:
package com.parag;
/*
* @author Parag Satav
*/
public boolean check(String password) {
boolean flagUppercase = false;
boolean flagLowercase = false;
boolean flagDigit = false;
boolean flag = false;
if (password.length() >= 10) {
for (int i = 0; i < password.length(); i++) {
if (!Character.isLetterOrDigit(password.charAt(i))) {
return false;
}
if (Character.isDigit(password.charAt(i)) && !flagDigit) {
flagDigit = true;
}
if (Character.isUpperCase(password.charAt(i)) && !flagUppercase) {
flagUppercase = true;
}
if (Character.isLowerCase(password.charAt(i)) && !flagLowercase) {
flagLowercase = true;
}
}
}
if (flagDigit && flagUppercase && flagLowercase) {
flag = true;
System.out.println("Success..");
} else
System.out.println("Fail..");
return flag;
}
来源:https://stackoverflow.com/questions/13674449/checking-password-code