我正在尝试在 c 中创建人员链表。
我所有的方法都在 main()
中工作,直到我将它们放入 while 循环(用于读取来自用户的命令)。一切都可以编译,但是当我尝试运行它时,它会崩溃并返回随机值。
这是我的部分代码。
结构:
struct Person{
const char* name;
const char* sex;
int age;
struct Person* next;
} *head;
方法插入:
void insert(struct Person* h, char*n, char* s, int a){
for(; h->next != NULL; h=h->next){}
struct Person* p = (struct Person*) malloc(sizeof(struct Person));
p->name=n;
p->age=a;
p->sex=s;
p->next=NULL;
h->next=p;
}
和它不起作用的主要部分:
int main()
{
struct Person Maciek={"Maciek", "Male", 20, NULL};
head = &Maciek;
int comand = 0;
while(comand != 6){
printf("Choose command:\n 1-insert person \n 2-delete by index \n 3-delete by name \n 4-display by index \n 5-print whole list \n 6-exit\n");
scanf("%d", &comand);
if(comand == 1){
printf("Name, Gender, Age\n");
char* name;
char* sex;
int age;
scanf("%s, %s, %d", &name, &sex, &age);
printf("Name %s, Sex %s, Age %d", name, sex, age);
insert(head, name, sex, age);
}
if(comand == 2){
printf("2\n");
}
if(comand == 3){
printf("3\n");
}
if(comand == 4){
printf("4\n");
}
if(comand == 5){
printf("5\n");
}
}
return 0;
}
我是 C/C++ 的新手,非常感谢任何帮助。
最佳答案
if(comand == 1){
printf("Name, Gender, Age\n");
char* name;
char* sex;
int age;
scanf("%s, %s, %d", &name, &sex, &age);
在这里你使用了悬挂指针(指向内存中的任何地方),你应该使用 malloc
来分配一些内存或使用 char 数组,正如 Carl Norum 指出的那样你不应该 &
在您的 scanf
调用中,因为您需要提供一些 char*
而不是 char**
。你可以这样做(这段代码容易受到缓冲区溢出的影响,不要在生产代码中使用它,考虑使用fgets
+sscanf
):
char name[50];
char sex[20];
int age = 0;
scanf("%s, %s, %d", name, sex, &age);
在你的插入函数中:
struct Person* p = (struct Person*) malloc(sizeof(struct Person));
p->name=n;
p->age=a;
p->sex=s;
您正在用 n 替换 p->name,而不是将 n 的内容复制到 p->name 中。你想要:
struct Person *p = malloc(sizeof(struct Person));
p->name = malloc(strlen(n)+1);
if(p->name == NULL) {
//error handling...
}
strcpy(p->name, n);
p->sex = malloc(strlen(s)+1);
if(p->sex == NULL) {
//error handling...
}
strcpy(p->sex, s);
p->age = a;
关于c - 在纯 C 列表实现方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16752430/