[C] Problem mit Programmierung von Schleifen

DAmico

Mitglied
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:
#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. :confused:

Ich würde mich freuen, wenn ihr mir helfen könnt. :)

Mit freundlichen Grüßen
 
Zuletzt bearbeitet von einem Moderator:
Hi

C++:
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:
#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++) //habe hier c<=5 gewählt, da "Hammer" ja 6 Buchstaben hat
{
	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:
Code:
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.
 
@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:
Code:
[ CPP ]//ohne Leerzeichen
doSomething(bool intresting)
{
cout<<"\a";
}
[ /CPP ]//ohne Leerzeichen
die Ausgabe des Codes wird demnach wie folg aussehen:
C++:
doSomething(bool intresting)
{
cout<<"\a";
}

MfG
 
Zuletzt bearbeitet von einem Moderator:
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:

C++:
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...
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?


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:
 
Zuletzt bearbeitet von einem Moderator:
Natürlich gibt es auch ein Oder, das würde dann so alles in allem ausschauen:

C++:
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:
C++:
int d;
char sonderzeichen[] = ".,-!#$%&*?_" ;

und statt der if-bedingung:

C++:
for(d=0;d<strlen(sonderzeichen);d++)
{
    if(passwort[ c]==sonderzeichen[d])
        b=1;
}

Gruß
 
Zuletzt bearbeitet:
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. :)
 
Zurück