9

ここで初歩的な質問: 簡単なメニュー インターフェイスを作成しようとしていますが、セグメンテーション違反エラーが発生し続け、その理由がわかりません。

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

どのメニュー オプションでも、2 つのフィールドを入力するとセグメンテーション違反が発生します

4

2 に答える 2

12

ポインタを初期化する必要があります。または、スタック割り当て配列を使用します。

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

現在、初期化されていないポインターを渡していますscanf()。これは、事実上、メモリの未定義領域にscanf()書き込むことを意味します。ある実行で機能し、次の実行で失敗する可能性があります。プロセスのアドレス空間の他の場所でメモリが破損する可能性があります。

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

于 2012-11-19T04:58:27.240 に答える
3

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

于 2012-11-19T05:00:42.343 に答える