2012-11-19 53 views
5

câu hỏi noob ở đây: Tôi đang cố gắng viết một giao diện menu đơn giản, nhưng tôi vẫn gặp phải lỗi lỗi phân đoạn và tôi không thể hiểu tại sao.lỗi phân đoạn sử dụng 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; 
    } 

tôi nhận được lỗi segmentation sau khi vào hai lĩnh vực, trong bất kỳ tùy chọn trình đơn

+1

Bạn chưa đặt trước bất kỳ bộ nhớ nào cho chuỗi của mình. Một con trỏ uninitialized là một con trỏ uninitialized. – chris

Trả lời

6

Bạn cần phải khởi tạo con trỏ của bạn. Ngoài ra, sử dụng mảng được phân bổ theo stack. Ví dụ: thay vì char *name, hãy làm char name[20]. (Lưu ý rằng điều này sẽ hạn chế đầu vào của bạn đến 19 ký tự, sử dụng một bộ đệm lớn hơn nếu cần thiết.)

Ngay bây giờ, bạn đang đi qua con trỏ chưa được khởi tạo vào scanf() mà hiệu quả có nghĩa là scanf() sẽ viết thư cho một không xác định diện tích ký ức. Nó có thể làm việc trên một thực thi và sau đó không thành công trong lần tiếp theo. Nó có thể làm hỏng bộ nhớ ở nơi khác trong không gian địa chỉ của tiến trình.

Không sử dụng các biến chưa được khởi tạo và xem xét việc bật cảnh báo trình biên dịch của bạn cao như chúng sẽ đi; trình biên dịch có thể bắt lỗi như thế này và phát ra một cảnh báo.

2

Thay vì sử dụng * tên, * mật khẩu, .. sử dụng tên [100], mật khẩu [100], ... Nếu bạn muốn đặt tên, mật khẩu, .. thành con trỏ rồi cấp phát bộ nhớ bằng cách sử dụng malloc hoặc calloc trước khi gọi scanf.