簡體   English   中英

使用scanf進行分段錯誤

[英]segmentation fault using scanf

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

在任何菜單選項中輸入兩個字段后,我得到分段錯誤

你需要初始化你的指針。 或者,使用堆棧分配的數組。

例如,不要使用char *name ,而是使用char name[20] (請注意,這會將輸入限制為19個字符;如有必要,請使用更大的緩沖區。)

現在,您將未初始化的指針傳遞給scanf() ,這實際上意味着scanf()將寫入未定義的內存區域。 它可能在一次執行時起作用,然后在下一次執行時失敗。 它可能會破壞進程地址空間中其他位置的內存。

不要使用未初始化的變量,並考慮將編譯器警告盡可能高地調高; 編譯器可以捕獲這樣的錯誤並發出警告。

而不是使用* name,* password,..使用名稱[100],密碼[100],...如果你想要名稱,密碼,..作為指針,那么在調用scanf之前使用malloc或calloc分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM