11 svar
41 visningar
josefinanord är nöjd med hjälpen!
josefinanord 104
Postad: 28 mar 2019

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 104
Postad: 28 mar 2019 Redigerad: 28 mar 2019

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 4378
Postad: 28 mar 2019

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 4378
Postad: 28 mar 2019

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

josefinanord 104
Postad: 28 mar 2019

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 104
Postad: 28 mar 2019

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

Laguna Online 4378
Postad: 28 mar 2019
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 104
Postad: 28 mar 2019

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 104
Postad: 28 mar 2019

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 4378
Postad: 28 mar 2019
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 104
Postad: 28 mar 2019

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 4378
Postad: 28 mar 2019

Det ska tydligen vara length().

Svara Avbryt
Close