2017-12-09 4 views
-4

Also grundsätzlich möchte ich ein Programm erstellen, das nach einem Benutzernamen und einem Passwort fragt, um das eigentliche Programm einzugeben. Ich habe versucht, so etwas zu tun, aber wenn ich den ersten Benutzernamen und das Passwort eintippe, lässt es mich nicht durch. Auf der anderen Seite, wenn ich den zweiten Benutzernamen und das Passwort eingeben, funktioniert es. Kann mir jemand erklären warum?Benutzername und Passwort in C

#include<stdio.h> 
    #include<string.h> 
    #define MAX 100 
    #define LEN 40 

    int names(char listName[][LEN]); 
    void pass(char listPass[][LEN]); 

    int main() 
    { 
    char name[LEN]; 
    char password[LEN]; 
    char listName[MAX][LEN]; 
    char listPass[MAX][LEN]; 
    int i; 

    names(listName); 
    pass(listPass); 


    printf("Enter username: "); 
    scanf("%s", name); 

    printf("Enter password: "); 
    scanf("%s", password); 

    for(i = 0; i< 2; i++) 
    { 
     if (strcmp(listName[i], name) == 0 && strcmp(listPass[i], password) == 0) 
     { 
      printf("Access granted\n"); 
      break; 
     } 
     else 
     { 
      printf("Access denied\n"); 
      break; 
     } 
    } 

    getch(); 
    } 

    int names(char listName[][LEN]) 
    { 
     int i; 
     strcpy(listName[i], "Vince"); 
     strcpy(listName[i], "Jeremy"); 
    } 

    void pass(char listPass[][LEN]) 
    { 
     int i; 
     strcpy(listPass[i], "aBc2xyz8"); 
     strcpy(listPass[i], "fa7saC12"); 
    } 
+1

Sie sollten immer den Wert aller Variablen kennen. Welchen Wert hat 'i', wenn Sie die Funktionen' names() 'und' pass() 'eingeben? – pmg

Antwort

1

Compile mit Warnungen aktiviert und Sie würden sehen, dass die Variable i uninitialized hier verwendet wird:

int names(char listName[][LEN]) 
{ 
    int i; 
    strcpy(listName[i], "Vince"); 
    strcpy(listName[i], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    int i; 
    strcpy(listPass[i], "aBc2xyz8"); 
    strcpy(listPass[i], "fa7saC12"); 
} 

Was Sie jetzt haben, ist undefiniertes Verhalten, das heißt es kann alles passieren. Wahrscheinlich würden Sie nur einen zufälligen Absturz bekommen.

Sie strcpy(listName[0], "Vince"); gemeint, strcpy(listName[1], "Jeremy");


jedoch, was man wirklich tun möchten, ist, diese Variablen zu definieren * aus main und initialisieren sie dort. Ermöglichen Sie auch Kennwörter und Benutzernamen unterschiedlicher Länge, indem Sie ein Array von Zeigern auf char verwenden. Zum Beispiel:

char *listName[MAX] = { "Vince", "Jeremy" }; 
char *listPass[MAX] = { "aBc2xyz8", "fa7saC12" }; 

int main(void) { ... 

Oder noch besser, eine Struktur für Benutzerdaten verwenden:

struct user_data { 
    char *username, *password; 
}; 

struct user_data users[MAX] = { 
    { "Vince", "aBc2xyz8" }, 
    { "Jeremy", "fa7saC12" } 
}; 
1

In Namen() und() übergeben Sie verwenden i nicht initialisiert, beide strcpy Operationen die kopieren gehen gleicher Array-Index.

0

Code Es folgt nicht, was Sie bestimmt:

int names(char listName[][LEN]) 
{ 
    int i; 
    strcpy(listName[i], "Vince"); 
    strcpy(listName[i], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    int i; 
    strcpy(listPass[i], "aBc2xyz8"); 
    strcpy(listPass[i], "fa7saC12"); 
} 

Sie sollten i initialisieren und es zwischen den Aussagen erhöhen oder einfach verwenden:

int names(char listName[][LEN]) 
{ 
    strcpy(listName[0], "Vince"); 
    strcpy(listName[1], "Jeremy"); 
} 

void pass(char listPass[][LEN]) 
{ 
    strcpy(listPass[0], "aBc2xyz8"); 
    strcpy(listPass[1], "fa7saC12"); 
} 
Verwandte Themen