tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
967
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DAmico DAmico ist offline Mitglied Bronze
    Registriert seit
    Mar 2010
    Beiträge
    25
    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üßen
    Geändert von zerix (21.03.10 um 14:20 Uhr) Grund: code-Tags eingefügt
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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ß
    DAmico bedankt sich. 

  3. #3
    DAmico DAmico ist offline Mitglied Bronze
    Registriert seit
    Mar 2010
    Beiträge
    25
    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
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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 bedankt sich. 

  5. #5
    Avatar von Marschal
    Marschal Marschal ist offline Großer Enumerator
    Registriert seit
    May 2008
    Ort
    Lohfelden (bei Kassel)
    Beiträge
    363
    @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 :
    1
    2
    3
    4
    5
    6
    
    [ CPP ]//ohne Leerzeichen
    doSomething(bool intresting)
    {
    cout<<"\a";
    }
    [ /CPP ]//ohne Leerzeichen
    die Ausgabe des Codes wird demnach wie folg aussehen:
    Code cpp:
    1
    2
    3
    4
    
    doSomething(bool intresting)
    {
    cout<<"\a";
    }

    MfG
     


    " Gehirn: ein Organ, mit dem wir denken, daß wir denken. "
    Ambrose Bierce

  6. #6
    DAmico DAmico ist offline Mitglied Bronze
    Registriert seit
    Mar 2010
    Beiträge
    25
    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:

    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...
    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:
     

  7. #7
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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
    DAmico bedankt sich. 

  8. #8
    DAmico DAmico ist offline Mitglied Bronze
    Registriert seit
    Mar 2010
    Beiträge
    25
    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

  1. While-Schleifen Problem
    Von Manda im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 21.05.09, 16:07
  2. schleifen problem
    Von Wulfel1992 im Forum PHP
    Antworten: 10
    Letzter Beitrag: 04.10.08, 13:03
  3. Schleifen Problem
    Von Snakebite im Forum Flash Plattform
    Antworten: 6
    Letzter Beitrag: 11.02.07, 00:08
  4. For-Schleifen Problem
    Von poli-dori im Forum Flash Plattform
    Antworten: 5
    Letzter Beitrag: 22.07.05, 18:48
  5. Schleifen-Problem
    Von devilzride im Forum PHP
    Antworten: 4
    Letzter Beitrag: 09.02.05, 23:41

Stichworte