[英]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.