Kontrollera lösenord
I uppgiften ska jag skapa en metod som kontrollerar lösenord och beroende på om de uppfyller mina krav ska metoden returnera true eller false. Programmet kompilerar utan problem men får alltid false, även där det ska vara true, när jag kör det. Min kod:
public class Password {
public static boolean passwordCheck (){
String lower = "abcdefghijklmnopqrstuvwxyz";
String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String digits = "0123456789";
Scanner in = new Scanner(System.in);
System.out.print("Enter a password: ");
String password = in.nextLine();
if(password.contains(lower) && password.contains(upper) && password.contains(digits)){
return true;
} else {
return false;
}
}
public static void main(String[] args) {
System.out.print(passwordCheck());
}
}
Uppskattar alla tips!
Jag ser vad problemet är, eftersom jag får true när jag skriver in alla tre strängarna tillsammans som lösenordet, däremot vill jag ju kunna testa om någon av karaktärerna från de tre strängarna finns med i lösenordet samtidigt.
Jag vet inte, men metoden 'contains' kanske kollar om _hela_ den strängen ingår, och det gör den ju inte. I så fall får du kolla efter någon annan lämplig strängfunktion.
Ska förresten ett lösenord som Aa9+8 godkännas?
Jo, tänkte det också. Vet att det ska finnas något som heter regular expressions och en metod som heter matches(), är däremot inte bekant med det eller har använt det förut.
Nej, lösen som använder specialtecken ska ej godkännas.
josefinanord skrev:Nej, lösen som använder specialtecken ska ej godkännas.
Då gör din kod fel för dem.
Reguljära uttryck är enkla i det här fallet: [0123456789] matchar ett av tecknen innanför klamrarna. Man kan förkorta det till [0-9]. Och motsvarande för a-z och A-Z.
För att kolla att inget annat tecken förekommer kan du använda negation innanför klamrarna. Det blir så här: [^0-9a-zA-Z] och den matchningen ska alltså inte lyckas.
Ett alternativ är att gå igenom lösenordet tecken för tecken och kolla varje enskilt.
menar du så att jag kan skriva såhär istället?
if(password.matches(".*[a-z].*") && password.matches(".*[A-Z].*") && password.contains(".*[0-9].*")){
return true;
}
För det gör ju bara samma sak, att den letar efter en exakt matchning utan att kolla på varje individuellt tecken.
Skulle kanske kunna använda String.indexOf() men då måste jag väl göra det för varje tecken, vilket känns lite tradigt..
josefinanord skrev:menar du så att jag kan skriva såhär istället?
if(password.matches(".*[a-z].*") && password.matches(".*[A-Z].*") && password.contains(".*[0-9].*")){
return true;
}För det gör ju bara samma sak, att den letar efter en exakt matchning utan att kolla på varje individuellt tecken.
Om 'matches' matchar hela strängen, ja, annars kanske "[a-z]" osv. räcker.
char[] search = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N'
,'O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e'
,'f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9'};
for(int i = 0; i < password.length; i++){
char ch = password.charAt(i);
for(int j = 0; j < search.length; j++){
if(search[j] == ch){
return true;
}
}
}
Nu gjorde jag detta, som jag tror kan funka, däremot får jag detta error-meddelandet när jag försöker kompilera:
Det ska tydligen vara length().