0

Im writing a program to get the password from the user and make sure it is at least 8 characters, 1 uppercase, and 1 number. If you cant find a password the sentinel is Q to quit but it won't work. Here's what I have...

import java.util.Scanner;

public class Chapter5ProblemSet {

    public static void main(String[] args) {   
        String password = getPassword();
        String validatePassword = validatePassword(password);
        displayPassword(validatePassword);

    }

    public static String getPassword(){
        String password = "";
        Scanner in = new Scanner (System.in);
        System.out.print("Please enter a password: ");
        password = in.next();
        return password;
    }



    //must be 8 characters, contain 1 uppercase, contain 1 digit
    public static String validatePassword(String password){
        String validatePassword = "";
        boolean oneUpperCase = false;
        boolean oneDigit = false;
        final String SENTINEL = "Q";
        Scanner in = new Scanner (System.in);

        while (!oneUpperCase || !oneDigit || password.length()< 8){
           validatePassword = "Please try again or enter Q to quit: ";
           System.out.print(validatePassword);
           password = in.next();

           oneUpperCase = !password.equals(password.toLowerCase());
           oneDigit = password.matches(".*\\d.*");
        } 
            validatePassword = "Password Ok";

        while(!password.equals(SENTINEL));
            System.out.print("Quit");
        return validatePassword;
    }

    public static void displayPassword(String validatePassword){

        System.out.println(validatePassword);
    }

}
Madhawa Priyashantha
  • 9,633
  • 7
  • 33
  • 60
Alyssa Zeick
  • 3
  • 2
  • 3

2 Answers2

0

You only need the first while loop: make your check for the SENTINEL value there, e.g.

public static String validatePassword(String password) {
    String validatePassword = "";
    boolean oneUpperCase = false;
    boolean oneDigit = false;
    boolean exit = false;
    final String SENTINEL = "Q";
    Scanner in = new Scanner(System.in);

    while (!exit && (!oneUpperCase || !oneDigit || password.length() < 8)) {
        validatePassword = "Please try again or enter Q to quit: ";
        System.out.print(validatePassword);
        password = in.next();

        oneUpperCase = !password.equals(password.toLowerCase());
        oneDigit = password.matches(".*\\d.*");
        exit = password.equals(SENTINEL);
    }
    validatePassword = "Password Ok";

    System.out.print("Quit");
    return validatePassword;
}
spudone
  • 1,267
  • 7
  • 10
0
public static Boolean validPassword(String input){
  /* Simply leave out (?=.*[@#$%^&+=]) if you don't want at
   * least one special character
   */
  return input.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\S+$).{8,}$");

}

public String validatePassword(){

   Scanner in = new Scanner(System.in);
   String input = "";


   do {

     System.out.print("Enter password to validate or \"q\" to quit: ");
     input = in.next();

     if( input.lowercase().equals("q") ) {
       return "Cancelled";
     }

   } while( ! validPassword(input) );

   return "Password Ok";

}

(regex shamelessly "borrowed" from Tomalak's excellent answer on a similar question)

Community
  • 1
  • 1
Markus W Mahlberg
  • 19,711
  • 6
  • 65
  • 89