Programm das auf Ziffern testet (Java)?
Hallo,
weiß jemand, wie man es hinkriegt, dass ein Programm in Java mit den Methoden string.charAt(i), string.toCharArray() und String.valueOf() (keine anderen String Methoden) testet, ob ein eigegebenes Passwort beispielsweise genug Zeichen insgesamt, Kleinbuchstaben und Großbuchstaben hat?
Als Beispiel: mindestens 10 Zeichen, 2 Kleinbuchstaben und 2 Großbuchstaben?
Hatte schon ein paar Ideen, aber will das mit den Methoden (und ohne andere Strint Methoden) versuchen, Antworten wären super, gerne auch im Code direkt :).
Mit freundlichen Grüßen
2 Antworten

string.toCharArray() macht dir ja ein Array - Und mit .length kriegt man die Länge eines jedes Arrays.
Um die Anzahl an Zeichen zu ermitteln kannst du also einfach
char[] passwordArray = password.toCharArray()
int arrayLength = passwordArray.length;
benutzen.
Um die Anzahl an Großbuchstaben zu zählen kannst du mit einer for-schleife das Char-Array durchgehen ( for(int i = 0; i < arrayLength; i++) ), und für jeden Char prüfen ob er groß ist, und wenn ja dann einen Zähler erhöhen.
if(Character.isUpperCase(passwordArray[i]) { bigLetterCounter++;} )
Selbiges natürlich auch mit isLowerCase().

1) Genau! Wollte dass du da selber draufkommst, und du bist draufgekommen, super :D
2) da musst du schauen ob der Zähler kleiner 2 ist. Den Zähler „i“ zu nennen ist nicht sehr empehlenswert. Nenn die Zähler bigLetterCounter und smallLetterCounter oder so :D
if(bigLetterCounter < 2) { ... } //Wenn es weniger als 2 große Buchstaben gibt -> Fehler ausgeben
3) Jap!

Kann man da jetzt auch noch irgendetwas mit Sonderzeichen machen? :)
Werden ja auch bei vielen Passwörtern gefordert.

Schwer, sowas wie eine Character.isSonderzeichen() Methode gibt es nicht.
Normal macht man das mit Regex, aber das ist ja in deiner Aufgabenstellung verboten, du darfst ja nur die drei String-Methoden da hernehmen.
Du kannst natürlich einfach alles als Sonderzeichen zählen, das weder Buchstabe noch Zahl ist.
if(!Character.isDigit(passwordArray[i]) && !Character.isLetter(passwordArray[i]) {
sonderzeichenCounter++;
}
Auf deutsch:
Wenn ( das Zeichen an Stelle i keine Zahl ist UND das Zeichen an Stelle i kein Buchstabe ist) dann Erhöhe den Counter der die Sonderzeichen zählt.


kann man dann eigentlich auch bestimmte stellen verbieten? zum beispiel, dass das passwort nicht mit einem sonderzeichen beginnen darf?

if(!Character.isDigit(passwordArray[0]) && !Character.isLetter(passwordArray[0])
{
System.out.println("Passwort darf nicht mit Sonderzeichen beginnen");
return;
}
Einfach überprüfen ob die erste Stelle (also [0]) ein Sonderzeichen ist. (Sowas macht man ausserhalb der for-Schleife)

und kann man das dann auch zum beispiel für die 3. letzte stelle machen?
denn die variiert ja immer.
also habe ich nicht vor (zumindest nicht ursprünglich), aber daraus lernt man ja immer :D

passwordArray.length - 3
if(!Character.isDigit(passwordArray[passwordArray.length - 3]) && !Character.isLetter(passwordArray[passwordArray.length - 3])
{
System.out.println("Passwort darf nicht an dritt-letzter Stelle ein Sonderzeichen haben");
return;
}


Mache sowas immer zum Spaß - Irgendwann hat man den Dreh einfach raus. :D

und macht man das dann einfach nach der for schleife? du meintest ja außerhalb

Davor würd ichs machen.
Weil warum noch lange die Schleife durchlaufen und überprüfen ob Großbuchstaben etc. im Passwort sind, wenn das Passwort so schon nicht erlaubt ist.
Die kürzeren Überprüfungen macht normal man immer zuerst. Ist aber optional. Sorgt halt dafür dass das Programm schneller läuft. :D

Iteriere über jedes Zeichen vom String und leg dir 3 Variablen für Zahl, Groß / Kleinbuchstaben an
Dann testest du jedes Zeichen:
if(Character.isDigit(char))
zahl++;
else if(Character.isUpperCase(char))
groß++;
else if(Character.isLowerCase(char))
klein++;
Dann am Ende schaust du, ob zahl > 10 ist, usw

wie genau „iteriert“ man denn ein Passwort? Und geht das nur, wenn man das Passwort vorher schon kennt, oder bei jedem beliebigem Passwort, das man eingibt?

for(var char : password.toCharArray()){
//Jeden Char anschauen
}

Eine Frage hätte ich noch: Wie schaffe ich es, dass sich das Programm dabei auf den Scanner bezieht, den ich deklariert habe?


also erstelle ich erst den Scanner, dann kann man etwas eingeben und das mache ich dann durch meinString = scannername.nextLine(); zu einem String den ich dann mit.toCharArray() zu einem Array machen und untersuchen kann, habe ich das richtig verstanden? :)


Super, dann danke für die Hilfe und Deine Zeit :D

Sorry dass ich dich doch noch einmal störe😅
Hatte das jetzt gerade so weit ausprobiert, wenn ich aber nun die for-Schleife
for(var char : dasPasswort [mein String].toCharArray() )
eingebe, bekomme ich ein paar Fehlermeldungen:
-einmal sei das kein Statement
-nach dem var würde ein Semikolon erwartet
-zwischen char und : würde ein .class erwartet
-nach toCharArray würde ein weiteres Semikolon erwartet
Weißt Du vielleicht, woran das liegen könnte und wie ich das beheben kann?

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String passwort = scanner.nextLine();
int zahl = 0, groß = 0, klein = 0;
for (var c : passwort.toCharArray()) {
if (Character.isDigit(c))
zahl++;
else if (Character.isUpperCase(c))
groß++;
else if (Character.isLowerCase(c))
klein++;
}
System.out.println(zahl < 10 || groß < 2 || klein < 2 ? "Ungültiges Passowort" : "Okay!");
}


mach doch bitte
for (char c : passwort.toCharArray()) und nicht for (var c : ..)
- Benutzt nicht schon jeder Java 10
- Ist das für Anfänger verwirrend

So heisst die Variable dann.
Was seine for-Schleife macht:
Das selbe wie
for(int i = 0; i< passwort.toCharArray.length; i++) {
var c = passwort.toCharArray()[i];
...
}
Sie geht jeden buchstaben aus dem passwort-charArray durch und speichert ihn für den jeweiligen Durchgang in einer Variable c.
Benutz als Anfänger lieber eine for(int i = 0; i< array.length; i++) Schleife, wenn die mit dem Doppelpunkt noch nicht kennst.

Irgendwas muss ich falsch gemacht haben, denn es wird immer „Das Passwort ist zu schwach“ ausgegeben :/ :
private void passwortTest()
{
int ziffer = 0;
int groß = 0;
int klein = 0;
Scanner scanny = new Scanner(System.in);
String passwort = scanny.nextLine();
for (char c : passwort.toCharArray() )
{
if (Character.isDigit(c))
{
ziffer++;
}
else if (Character.isUpperCase(c))
{
groß++;
}
else if (Character.isLowerCase(c))
{
klein++;
}
}
if (ziffer >= 10)
{
if (groß >= 2)
{
if (klein >= 2)
{
System.out.println("Das Passwort ist gut genug!");
}
}
}
else
{
System.out.println("Das Passwort ist zu schwach!");
}
}
}

das mit dem if am ende hatte ich auch schon mit
if (ziffer >= 10 && groß >= 2 && klein >= 2)
versucht, aber da war das gleiche ergebnis

Weil Ziffer die Ziffern zählt.
„Ziffer“ bedeutet „Zahl“.
Laut deiner Frage willst du garnicht zählen wieviele Zahlen im Wort sind. Keine Ahnung wie der Antwortgeber da drauf kommt. Aber das mit dem Ziffer-Zähler kannste weglassen.
Was du wissen willst ist:
Hat das Passwort mehr als 10 Zeichen? Also:
“Ist das CharArray Länger als 10?“
if(passwort.toCharArray().length > 10) ...

Super, nimm das her. Ist viel schöner als 3 ifs ineinander. Nur du musst halt „ziffer“ mit „arraylänge“ austauschen. :D

Ziffern sind
0,1,2,3,4,5,6,7,8,9
Momentan prüfst du, ob von denen mehr als 10 in deinem Wort sind.
Das ist der Fehler.
Gib AAbb1234567890 ein, und das Passwort wird angenommen werden.
Aber ja, dass du die Ziffern (zumindest laut deiner Fragestellung) nicht zählen musst hab ich dir ja schon gesagt. :D

Wenn ich das so versuche, sagt er mir „cannot find symbol - variable toCharArray“ :/
for (int i = 0; i < passwort.toCharArray.lenght; i++)
an der Stelle halt


toCharArray()
hab die Klammern vergessen, sorry. toCharArray eine Methode, also müssen so Klammern dahinter.

vergiss das dann, gutefrage hat irgendwie rumgespinnt bei mir und mir eine falsche sache angezeigt, jetzt wo es funktioniert und ich deine antwort gesehen habe ergibt alles sinn :D Danke!!

obwohl, funktioniert gerade doch nicht🙈
if (passwort.toCharArray().lenght >= 10 && groß >= 2 && klein >= 2)
{
Sytem.out.println(„Das Passwort ist gut“)
}
else
...
Irgendwie sagt er mir wieder „cannot find symbol - variable lenght“


Ja, ich hab statt Zeichen Zahlen gelesen oder gedacht :) Naja, diese kleine Änderung hätte man ja auch selbst erkennen können


okay, habe noch kurz 3 Fragen dazu:
1) Und dann kann man zur Länge einfach if lenght >= 10 System.out.println(„xy“); ?
2) Und für die Groß- und Kleinbuchstaben ja eigentlich genau so: if i <= 2 System.out.println („xyz“); ?
3) Und den String kann man einfach mit toCharArray() zu einem Array machen, oder?
Nur kurz zu meiner Bestätigung, bevor ich da jetzt einen dummen Denkfehler mache und mich am Ende frage, wieso es nicht funktioniert😅