2012-11-19 38 views
5

noob Frage hier: Ich versuche, eine einfache Menü-Schnittstelle zu schreiben, aber ich bekomme immer eine Segmentierung Fehler Fehler und ich kann nicht herausfinden, warum.segmentation fault using scanf

#include <stdlib.h> 
#include <stdio.h> 
int flush(); int add(char *name, char *password, char *type); int delete(char *name); 
int edit(char *name, char *password, char *type, char *newName, char *newPassword, char   *newType); 
int verify(char *name, char *password); 



int menu(){ 
    int input; 
    char *name, *password, *type, *newName, *newPassword, *newType; 
    printf("MAIN MENU \n ============\n"); 
    printf("1. ADD\n"); 
    printf("2. DELETE\n"); 
    printf("3. EDIT\n"); 
    printf("4. VERIFY\n"); 
    printf("5. Exit\n"); 
    printf("Selection:"); 
    scanf("%d", &input); 
    flush(); 
    switch (input){ 

    case 1: 
     printf("%s\n", "Enter Name:"); 
     scanf("%s", name); 
     flush(); 
     printf("%s\n", "enter password"); 
     scanf("%s", password); 
     flush(); 
     printf("%s\n","enter type"); 
     scanf("%s",type); 
     add(name, password, type); 
     menu(); 
     break; 
    case 2: 
     printf("Enter Name:"); 
     scanf("%s",name); 
     flush(); 
     delete(name); 
     menu(); 
     break; 
    case 3: 
     printf("Enter Name:\n"); 
     scanf("%s",name); 
     flush(); 
     printf("Enter Password\n"); 
     scanf("%s", password); 
     flush();    
     printf("enter type:\n"); 
     scanf("%s", type); 
     flush(); 
     printf("enter your new username:\n"); 
     scanf("%s",newName); 
     flush(); 
     printf("enter your new password\n"); 
     scanf("%s", newPassword); 
     flush(); 
     printf("enter your new type\n"); 
     scanf("%s",newType); 
     flush(); 
     edit(name, password, type, newName, newPassword, newType); 
     menu(); 
     break; 
    case 4: 
     printf("Enter Name\n"); 
     scanf("%s",name); 
     flush(); 
     printf("Enter Password\n"); 
     scanf("%s",password); 
     flush(); 
     verify(name, password); 
     menu(); 
     break; 
    case 5: 
     return 0; 
    default: 
     printf("invalid input, please select from the following:\n"); 
     menu(); 
} 
    return 0; 
    } 

    int flush(){ 
    int ch; 
    while ((ch = getchar()) != EOF && ch != '\n') ; 
    return 0; 
    } 

Ich erhalte die Segmentierung Fehler nach zwei Felder eingeben, in jedem Menüpunkt

+1

Sie haben keinen Speicher für Ihre Strings reserviert. Ein nicht initialisierter Zeiger ist ein nicht initialisierter Zeiger. – chris

Antwort

6

Sie benötigen Zeiger zu initialisieren. Alternativ können Sie Stack-Allocated-Arrays verwenden.

Zum Beispiel statt char *name, tun Sie char name[20]. (Beachten Sie, dass dies Ihre Eingabe zu 19 Zeichen begrenzen, verwenden Sie einen größeren Puffer, falls erforderlich.)

Gerade jetzt, Sie vorbei nicht initialisierte Zeiger in scanf() die effektiv bedeutet, dass scanf() zu einem undefined Bereich schreiben wird von Erinnerung. Es kann bei einer Ausführung funktionieren und bei der nächsten fehlschlagen. Es kann Speicher an anderer Stelle im Adressraum des Prozesses beschädigen.

Verwenden Sie keine nicht initialisierten Variablen und erwägen Sie, die Compilerwarnungen so hoch wie möglich zu setzen; Der Compiler kann Fehler wie diese erkennen und eine Warnung ausgeben.

2

Anstelle von * name, * password, .. benutze name [100], password [100], ... Wenn du name, password, .. pointer willst, dann reserviere malloc oder calloc vor dem Aufruf scanf.