2016-09-16 6 views
-2

Ich versuche, einen Code zu schreiben, um ein Passwort für einen Großbuchstaben zu überprüfen. Wenn ich ein Passwort mit einem Großbuchstaben eintippe, läuft das Programm wie erwartet (druckt '1' und das eingegebene Passwort aus). Wenn ich jedoch ein Passwort ohne einen Großbuchstaben eingeben, stürzt das Programm ab.Programm stürzt ab

Mein Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() { 

    char password[100]; 
    int i = 0; 
    int upper = 0; 

    printf("Enter a password with an uppercase letter: "); 
    scanf("%s", password); 

    for (i = 0; i <= 100; i++) { 
     if (isupper(password[i])) { 
      upper = 1; 
      break; 
     } 
    } 

    printf("%d\n", upper); 
    printf("%s\n", password); 

    system("pause"); 
    return (0); 
} 

Die Fehler:

Debug Assertion Failed!

Programm: ... 15 \ Projects \ ConsoleApplication3 \ Debug \ ConsoleApplication3.exe Datei: minkernel CRTs \ \ ucrt \ src \ appcrt \ \ isctype.cpp conversion: 36

Ausdruck: c> = -1 & & c < = 255

Informationen darüber, wie Sie Ihr Programm ein Assertionsfehler führen kann, finden Sie in der Visual C++ Dokumentation behauptet.

(Drücken Sie erneut, um die Anwendung zu debuggen) ConsoleApplication3.exe hat ausgelöst einen Haltepunkt.

Debug-Assertion fehlgeschlagen!

Programm: ... 15 \ Projects \ ConsoleApplication3 \ Debug \ ConsoleApplication3.exe Datei: minkernel CRTs \ \ ucrt \ src \ appcrt \ \ isctype.cpp conversion: 42

Ausdruck: c> = -1 & & c < = 255

Informationen darüber, wie Sie Ihr Programm ein Assertionsfehler führen kann, finden Sie in der Visual C++ Dokumentation behauptet.

(Drücken Sie erneut, um die Anwendung zu debuggen) ConsoleApplication3.exe hat ausgelöst einen Haltepunkt. Das Programm '[13188] ConsoleApplication3.exe' wurde mit dem Code 0 (0x0) beendet.

+5

Sie haben ein Array von 100 Zeichen, aber Sie greifen auf die Zeichennummer 101 zu. Sie können auch außerhalb der eingegebenen Zeichenfolge gehen, da Sie nicht nach dem String-Terminator suchen und dadurch auf nicht initialisierten Speicher zugreifen. Normalerweise haben Sie keine Beschränkung für die Eingabe, was bedeutet, dass der Benutzer mehr als 100 Zeichen in Ihr Array schreiben könnte. All diese Probleme führen zu * undefiniertem Verhalten *. –

+0

Und Sie könnten bei dem ersten Null-Zeichen, das Sie übrigens finden, anhalten. aber die Nachricht ist lustig. Wie kann 'c> = -1 && c <= 255' für ein Zeichen fehlschlagen? –

+0

Und der Teil dieses Arrays, der nicht mit 'scanf' gefüllt ist, ist nicht initialisiert, so dass die Überprüfung seiner Werte wertlos ist. –

Antwort

1

ändern diese:

for (i = 0; i <= 100; i++) { 

zu

for (i = 0; i < 100 && password[i] != '\0'; i++) { 
       ^^^  ^^^^^^^^^^^^^^^^^^ 
     note: no =  check for end of string 

Sie haben

char password[100]; 

so die rechtliche Index ist nur 0 bis 99. Weiter Sie, wenn Sie überprüfen müssen habe das Ende der Zeichenfolge erreicht (aka Passwort [I]!= '\ 0')

Eine bessere Art und Weise zu tun, was Sie (inspiriert erreichen wollen durch @ Jean-Francois Fabre):

 scanf("%99s", password); 
      ^^ 
      To prevent buffer overflow 

    for (i = 0; i < strlen(password); i++) { 
     .... 
+1

Die korrekte Schleife würde beim ersten NULL-Zeichen anhalten und nicht bis zu 100. – PaulMcKenzie

+0

@PaulMcKenzie - Richtig. Vielen Dank. Antwort aktualisiert – 4386427

+0

Diese Änderung hat das Problem behoben (Danke!), Aber ich verstehe nicht warum. – Infected

0

Änderung:

for (i = 0; i <= 100; i++) 

zu:

for (i = 0; i < strlen(password); i++) 

Hinweis: Sie gehen aus, wenn kein Großbuchstabe vorhanden ist.

+0

Es war das Problem, ja. Es hat jedoch keinen Sinn, auf dasselbe zu antworten (aber etwas schlechter, weil "strlen" die Zeichenfolge bei jeder Iteration ausführt) als die aktuell korrekte existierende Antwort. –