菜鸟问题在这里:我正在尝试编写一个简单的菜单界面,但我不断收到分段错误错误,我无法弄清楚原因。
#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. ADDn");
printf("2. DELETEn");
printf("3. EDITn");
printf("4. VERIFYn");
printf("5. Exitn");
printf("Selection:");
scanf("%d", &input);
flush();
switch (input){
case 1:
printf("%sn", "Enter Name:");
scanf("%s", name);
flush();
printf("%sn", "enter password" );
scanf("%s", password);
flush();
printf("%sn","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 Passwordn");
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 passwordn");
scanf("%s", newPassword);
flush();
printf("enter your new typen");
scanf("%s",newType);
flush();
edit(name, password, type, newName, newPassword, newType);
menu();
break;
case 4:
printf("Enter Namen");
scanf("%s",name);
flush();
printf("Enter Passwordn");
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()
将写入未定义的内存区域。 它可能在一次执行中工作,然后在下一次执行中失败。 它可能会损坏进程地址空间中其他位置的内存。
不要使用未初始化的变量,并考虑将编译器警告调得尽可能高;编译器可以捕获此类错误并发出警告。
*password,..而是使用 name[100], password[100],...如果你想要名称,密码,..成为指针,然后在调用 scanf 之前使用 malloc 或 calloc 分配内存。