11 svar
320 visningar
josefinanord behöver inte mer hjälp
josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 15:36

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!

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 15:45 Redigerad: 28 mar 2019 15:45

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.

Laguna Online 30613
Postad: 28 mar 2019 15:46

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.

Laguna Online 30613
Postad: 28 mar 2019 15:49

Ska förresten ett lösenord som Aa9+8 godkännas?

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 15:50

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.

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 15:50

Nej, lösen som använder specialtecken ska ej godkännas.

Laguna Online 30613
Postad: 28 mar 2019 15:54
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.

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 16:16

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.

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 16:22

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..

Laguna Online 30613
Postad: 28 mar 2019 16:29
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.

josefinanord 103 – Fd. Medlem
Postad: 28 mar 2019 16:42

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:

Laguna Online 30613
Postad: 28 mar 2019 16:50

Det ska tydligen vara length().

Svara
Close