3Danke
ERLEDIGT
JA
JA
ANTWORTEN
7
7
ZUGRIFFE
967
967
EMPFEHLEN
-
Hallo zusammen,
ich bin gerade dabei ein Programm zu schreiben, dass feststellen soll wie sicher ein Passwort ist.
Es soll nur <stdio.h> und <math.h> verwendet werden und es soll ausschließlich mit Zeigern gearbeitet werden.
Dabei ist folgende Aufgabenstellung gegeben:
Schreibe ein C-Programm, das ein vom Benutzer eingegebenes Passwort einließt und Zeichen für Zeichen auf die Menge der Groß-, Kleinbuchstaben, Ziffern und Sonderzeichen hin überprüft. (Daraus ergibt sich die Größe des "Suchraums" aus dem das Passwort gebildet wurde)
Dazu soll man zur Kategorisierung der Zeichen die ASCII-Tabelle benutzen.
Die Länge des Passworts soll auch ausgegeben werden.
Die Sicherheit des Passworts berechnet sich aus (Suchraum) hoch (Länge des Passworts).
Da das Einlesen und die Bestimmung der Länge des Passwortes kein Problem darstellt hab ich mir einfach mal das Wort "Hammer" vorgegeben.
Hier mein bisheriges Programm:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <stdio.h> #include <math.h> int main () { //Variablendeklaration int Suchraum = 0; char Wort[] = "Hammer"; char *Passwort = NULL; int b; int c; //Ausrichtung des Zeigers Passwort = Wort; printf("%s\n", Wort); // Schleife, die untersucht, ob der erste Buchstabe ein Kleinbuchstabe ist for (c = 97; c <= 122; c++) //97 - 122 enthält in der ASCII Tabelle die Kleinbuchstaben { if (c == *Passwort) { b = 1; Suchraum = Suchraum + 26; break; } else { b = 0; } } printf("%d\n", b); printf("%d\n", Suchraum); return 0; }
Nun zu meinem Problem:
Meine geschriebene for-Schleife untersucht, ob der erste Buchstabe ein Kleinbuchstabe ist, dies triftt ja bei dem Passwort "Hammer" nicht zu.
Jetzt möchte ich um diese Schleife noch eine Schleife schreiben, die das gesamt Passwort auf Kleinbuchstaben untersucht und wenn ein Kleinbuchstabe vorkommt den Suchraum auf 26 erhöht, wenn kein Kleinbuchstabe vorhanden ist, den Suchraum bei 0 belässt.
Habe schon einige Versuche gestartet, bin aber bisher nicht auf die richtige Lösung gekommen.
Ich würde mich freuen, wenn ihr mir helfen könnt.
Mit freundlichen GrüßenGeändert von zerix (21.03.10 um 14:20 Uhr) Grund: code-Tags eingefügt
-
Hi
Code cpp:1 2 3 4 5 6
b=0; for(c=0;c<strlen(Passwort);c++) { if(Passwort[c]>='a'&&Passwort[c]<='z') b=1; }
Das wars schon-wenn b jetzt 1 ist, gibts Kleinbuchstaben im Passwort und du kannst den Suchraum erhöhen.
Für Grossbuchstaben musst du das ganze nur mit 'A' und 'Z' etc wiederholen; analog für Ziffern etc
Gruß
-
Gleich mal vorneweg,
ein großes Dankeschön für deine Hilfe.
Habe die Schleife von dir in mein Programm integriert und es funktioniert einwandfrei.
Das Programm schaut nun folgendermaßen aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> #include <math.h> int main () { //Variablendeklaration int Suchraum = 0; char Wort[] = "Hammer"; char *Passwort = NULL; int b = 0; int c; //Ausrichtung des Zeigers Passwort = Wort; printf("%s\n", Wort); for(c=0; c<=5;c++) [COLOR="Red"]//habe hier c<=5 gewählt, da "Hammer" ja 6 Buchstaben hat[/COLOR] { if(Passwort[c]>='a'&&Passwort[c]<='z') b=1; } printf("%d\n", b); if(b==1) Suchraum = Suchraum + 26; printf("%d\n", b); printf("%d\n", Suchraum); return 0; }
Zu folgender Zeile hätte ich noch eine Frage:
if(Passwort[c]>='a'&&Passwort[c]<='z')
wenn ich das richtig verstehe hilft das "&&" die Bedingung auf den Raum der Kleinbuchstaben festzulegen?
Wenn ich jetzt als nächstes untersuchen möchte, ob Großbuchstaben in meinem Passwort vorhanden sind,
muss ich dann meinen "Passwort"-Zeiger wieder auf den ersten Buchstaben des Passwort zurücksetzen?
Und wenn ja, wie lässt sich dieses umsetzen?
Mit freundlichen Grüßen
-
Zum Verständnis: im ASCII-Code sind die Kleinbuchstaben von a bis z alle hintereinander.
Mit der ersten Hälfte meiner if-Bedingung (vor dem &&) prüfe ich, ob der Buchstabe mindestens ein a ist, also ein a oder irgendwas danach
Die zweite Hälfte prüft, ob es vor dem z ist, maximal ein z ist noch erlaubt.
Das && heißt nur, das beide Teile der Bedingung stimmen müssen, um "b=1" auszuführen.
Wenn es also a oder danach ist und gleichzeitig z oder davor, dann muss es ein Kleinbuchstabe sein, die sind eben alle zusammen hinereinander.
Wenn du als nächstes die Großbuchstaben prüfen möchtest, musst du das "Passwort=Wort" nicht wiederholen; am Passwort wurde nichts verändert.
-
20.03.10 22:21 #5
@DAmico:
Benutz doch bitte bei allem, was du postest (Code) die dafär vorgesehenen Tags (In Eckigenklammern).
Der Für C++ also folgene Syntax im Editor verwenden:
die Ausgabe des Codes wird demnach wie folg aussehen:Code :1 2 3 4 5 6
[ CPP ]//ohne Leerzeichen doSomething(bool intresting) { cout<<"\a"; } [ /CPP ]//ohne Leerzeichen
Code cpp:1 2 3 4
doSomething(bool intresting) { cout<<"\a"; }
MfG
" Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
Ambrose Bierce
-
an sheel:
Vielen Dank für deine Erklärung, habe jetzt verstanden, wie sich diese schleife aufbaut.
Mein Programm ist nun soweit fertig, dass es Klein-, Großbuchstaben und Ziffern erkennen kann.
Mit den Sonderzeichen habe ich noch ein Problem:
Es dürfen nur folgende Sonderzeichen verwendet werden . , - ! # $ % & * ? _
Wenn man diese Zeichen nun in der ASCII Tabelle nachschlägt sieht man, dass diese nur zum teil zusammenhängend sind.
Gibt es dann nur die Möglichkeit mehrere Zusammenhängende if Bedingungen zu schreiben?
z.B. so:
Oder gibt es auch eine Möglichkeit diese ganzen Sonderzeichen in eine if Bedingung zu packen, indem man die Zeichen irgendwie mit "oder" verknüpft?Code cpp:1 2 3 4 5 6 7 8 9 10
for(c=0; c<=LaengePasswort;c++) { if(Passwort[c]>=','&&Passwort[c]<='.') b=1; else if (Passwort[c]>='#'&&Passwort[c]<='&') b=1; else if (Passwort[c]='!') b=1; und so weiter...
an Marschal:
Danke für den guten Tipp, da schaut des ganze gleich übersichtlicher aus.
Wie du siehst, hab ich es in diesem Post schon verwendet:
-
Natürlich gibt es auch ein Oder, das würde dann so alles in allem ausschauen:
Code cpp:1 2
if( (Passwort[c]>=','&&Passwort[c]<='.') || (Passwort[c]>='#'&&Passwort[c]<='&') || (Passwort[c]='!')) b=1;
Bei drei Bedingungen gehts ja noch.
Wenn es aber mehr zusammenhanglose Zeichen werden, würde das in ziemliche Schreibarbeit ausarten. In dem Fall macht man dann wirklich am besten eine innere Schleife, zb So:
Am Anfang noch die Variablen dazu:
Code cpp:1 2
int d; char sonderzeichen[] = ".,-!#$%&*?_" ;
und statt der if-bedingung:
Code cpp:1 2 3 4 5
for(d=0;d<strlen(sonderzeichen);d++) { if(passwort[c]==sonderzeichen[d]) b=1; }
GrußGeändert von sheel (21.03.10 um 14:13 Uhr) Grund: Rechtschreibfehler
-
Dankeschön dafür,
hab die Schleife eingebaut und sie funktioniert optimal.
Hab jetzt das Programm fertig geschrieben und es funktioniert einwandfrei.
Vielen Dank für deine schnelle Hilfe, habe mich sehr darüber gefreut.
Ähnliche Themen
-
While-Schleifen Problem
Von Manda im Forum C/C++Antworten: 4Letzter Beitrag: 21.05.09, 16:07 -
schleifen problem
Von Wulfel1992 im Forum PHPAntworten: 10Letzter Beitrag: 04.10.08, 13:03 -
Schleifen Problem
Von Snakebite im Forum Flash PlattformAntworten: 6Letzter Beitrag: 11.02.07, 00:08 -
For-Schleifen Problem
Von poli-dori im Forum Flash PlattformAntworten: 5Letzter Beitrag: 22.07.05, 18:48 -
Schleifen-Problem
Von devilzride im Forum PHPAntworten: 4Letzter Beitrag: 09.02.05, 23:41





Zitieren

Login






