2012-11-19 6 views
5

noob質問: シンプルなメニューインターフェイスを作成しようとしていますが、セグメンテーションフォールトエラーが発生し続けています。スキャンを使用したセグメント化エラー

#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; 
    } 

私はあなたがあなたのポインタを初期化する必要が任意のメニューオプション

+1

あなたの文字列にメモリを予約していません。初期化されていないポインタは、初期化されていないポインタです。 – chris

答えて

6

に、二つのフィールドを入力した後セグメンテーションフォールトを取得します。あるいは、スタックに割り当てられた配列を使用します。

たとえば、char *nameの代わりにchar name[20]を実行します。 (これは19個の文字に、あなたの入力を制限することに注意してください。必要であれば、より大きなバッファを使用)

今、あなたはscanf()に初期化されていないポインタを渡している事実scanf()はの未定義エリアへの書き込みしようとしていることを意味していますメモリ。 1回の実行で動作し、次の実行で失敗する可能性があります。プロセスのアドレス空間の他の場所でメモリが破損する可能性があります。

初期化されていない変数は使用しないでください。コンパイラの警告を高くすることを検討してください。コンパイラはこのようなエラーをキャッチして警告を発することができます。

2

* name、* password、..使用名[100]、パスワード[100] ...の代わりに、名前、パスワード、..をポインタにする場合は、呼び出し前にmallocまたはcallocを使用してメモリを割り当てます。 scanf。

関連する問題