Guten morgen zusammen,
Ich bin noch ziemlich neu in der Welt des Programmieren und zur Übung wollte ich ein Programm schreiben, wo man ein Passwort eingibt und es Kreterin erfüllen muss. Kreterien: Mind. Ein Großbuchstabe && Mind. Zwei Kleinbuchstabe && Mind. Eine Zahl && Mind. Ein Sondezeichen
Mein Code Sieht wie folgt aus:
Java:
importjava.util.Scanner;publicclass passwortgenerator{publicstaticvoidmain(String[] args){String wort;System.out.println("Geben sie ihr Passwort ein");Scanner sc =newScanner(System.in);
wort = sc.next();char charWort = wort.charAt(0);for(int x =0; x <= wort.length()&& wort.length()>=9; x++){if(Character.isUpperCase(charWort)){if(Character.isLowerCase(charWort)){if(Character.isDigit(charWort)){}else{System.out.print("Fehler");}}else{System.out.print("Fehler");}}else{System.out.print("Fehler");}}}}
Ich habe nun Zwei Probleme:
1. (Das wichtige) Wie erkennt man, am besten ohne ASCII, ob Sonderzeichen enthalten sind?
2. Wie kann man erkennen, wie oft (z.B.) Kleinbuchstaben enthalten sind?
Es tut mir leid nur ich habe wirklich nichts perfekt passendes gefunden, was funktioniert hat... Ich bedanke mich schon einmal Herzlich für eure Hilfe!
MfG Cookie
Im Prinzip würde es funktionieren, wobei ich die leere IF-Anweisung sehr unschön/unleserlich finde!
Du könntest die Prüfungen andersherum prüfen und dadurch das ELSE sparen !
Aber Du hast oben noch einen Denkfehler in der IF-Verschachtelung:
Du prüfst hier ja zunächst auf 'UpperCase'.
Wenn es KEIN Uppercase ist, gehst Du sofort mit der Ausgabe "Fehler" raus!
Die anderen Fälle ('LowerCase' und 'Digit') werden dann nicht mehr geprüft!
Wenn es aber ein Uppercase ist, dann machen die weiteren Prüfungen auf 'LowerCase' und 'Digit' nicht wirklich Sinn (entweder IST ein Großbuchstabe oder nicht) - zumal dann immer FEHLER ausgegeben würde !!
Du prüfst hier ja zunächst auf 'UpperCase'.
Wenn es KEIN Uppercase ist, gehst Du sofort mit der Ausgabe "Fehler" raus!
Die anderen Fälle ('LowerCase' und 'Digit') werden dann nicht mehr geprüft!
Wenn es aber ein Uppercase ist, dann machen die weiteren Prüfungen auf 'LowerCase' und 'Digit' nicht wirklich Sinn (entweder IST ein Großbuchstabe oder nicht) - zumal dann immer FEHLER ausgegeben würde !!
Es ist ja ein String der an mehreren Stellen geprüft werden soll ( in diesem Fall ein Passwort ) und es soll geprüftwerden ob dies Alles vorhanden ist. Wenn ich einen Logik Fehler habe könntest du mir ja evtl. einen Tipp geben?
Du prüfst ja jeweils nur EIN Zeichen des Strings, nicht alles auf einmal !
Also für EIN Zeichen könntest Du es bei Deinem Ansatz so prüfen:
Java:
if(!Character.isUpperCase(charWort)&&!Character.isLowerCase(charWort)&&!Character.isDigit(charWort)){// hier weißt Du jetzt, dass das zeichen KEIN Groß- oder Kleinbuchstabe oder Digit ist!!}
Jetzt musst Dir nur noch überlegen, wie Du das für alle Zeichen prüfst und dabei merkst, ob eines der Kriterien für das ganze Wort nicht erfüllt ist!
Kommt drauf an ... wenn man regex mag ist es einfach. Im übrigen löst es halt alles auf einen Streich. Wenn du das auscodierst wird es auch krank.
Edit: im übrigen liest es sich doch wunderschön:
mindestens 1 Ziffer, mindestens 1 Kleinbuschstabe, mindestens 1 Grossbuchstabe und mindestens 1 Sonderzeichen aus der Menge ...... und das ganze 8 - 20 Zeichen lang. Das kannst du dem Benutzer auch noch schön in einer Infobox anzeigen. Und ist mehr oder weniger der Standard für Passworte
publicbooleanistGueltig(){int großbuchstabe =0;int kleinbuchstabe =0;int zahl =0;int sonderzeichen =0;for(int x =0; x < wort.length()&& wort.length()>=9; x++){if(Character.isUpperCase(wort.charAt(x))){
großbuchstabe++;}if(Character.isLowerCase(wort.charAt(x))){
kleinbuchstabe++;}if(Character.isDigit(wort.charAt(x))){
zahl++;}if(!Character.isLetterOrDigit(wort.charAt(x))){
sonderzeichen++;}}return großbuchstabe >=2&& kleinbuchstabe >=2&& zahl >=2&& sonderzeichen >=2;}
Also es ist für mich die beste lösung gewesen und danke den anderen für die Hilfe, Außerdem hoffe ich ich kann noch jemanden hiermit helfen.
Tipps:
isUpperCase -> Testet auf Großbuchstaben
isLowerCase -> Testet auf Kleinbuchstaben
isDigit -> Testet auf Zahlen
!(not) isLetterOrDiggit -> Testet auf Sonderzeichen ( Alles außer Buchstaben und Zahlen )
nicht wirklich erfüllt, da Du jetzt nur dann TRUE ausgibst, wenn von allen vier Zeichenarten mindestens zwei vorhanden sind !!
Du kannst dies ja zur Übung auch mal korrigieren!
Danke @VfL_Freak, Ich habe mir die Kriterien (Für meine Maße) etwas erschwert um mehr Übung vom Praktischem zu bekommen, falls ich etwas Verwirrung dadurch gestiftet habe tut mir das leid und ich Korrigiere die Kriterien in der Frage falls weitere Anfänger dies auch als Übung benutzen wollen. Weiterhin Danke für den Tipp damit mein Code Leserlicher wird.
Also am Anfang haben die Kriterien die Oben standen gegolten, aber um mir selber alles etwas zu erschweren habe ich gesagt das jedes Kriterium 2x Vorkommen muss.
Mit den Oben stehenden Kriterien sieht der Code wie Folgt aus:
Java:
publicbooleanistGueltig(){int keinbuchstabe =0;int kleinbuchstabe =0;int zahl =0;int sonderzeichen =0;for(int x =0; x < wort.length()&& wort.length()>=9; x++){if(Character.isUpperCase(wort.charAt(x))){
großbuchstabe++;}if(Character.isLowerCase(wort.charAt(x))){
kleinbuchstabe++;}if(Character.isDigit(wort.charAt(x))){
zahl++;}if(!Character.isLetterOrDigit(wort.charAt(x))){
sonderzeichen++;}}return((großbuchstabe>0)&&(kleinbuchstabe >=2)&&(zahl>0)&&(sonderzeichen>0));//Rückgabe von}