2014-11-04 84 views
-4

我尝试制作关于学生注册的程序。尝试调用我的deleteStudent函数时出现分段错误(核心转储)

这是我的头文件:

#ifndef STUDENTREGISTRATION_H_ 
#define STUDENTREGISTRATION_H_ 
typedef struct { 
char name[30]; 
char surname[30]; 
char faculty[30]; 
char department[30]; 
int age; 
int grade; 
int count; 
} STUDENT_STRUCT, *STUDENT; 

STUDENT_STRUCT students[100]; 
STUDENT_STRUCT empty; 
void *data_init(); 
void *data_set(STUDENT s); 
void addStudent(int count,STUDENT s); 
void displayList(int count); 
void free_list(STUDENT s); 
void deleteStudent(int index,int count); 
void Choice(); 


#include <stdio.h> 
#include <stdlib.h> 
#include "string.h" 
#include "StudentREGISTRATION.h" 

void *data_set(STUDENT s) { 

s = students; 
return s; 
} 
void addStudent(int count,STUDENT s) { 

printf("Please enter an information about student:\n"); 
printf("Name:"); 
scanf("%s", s->name); 
printf("Surname:"); 
scanf("%s", s->surname); 
printf("Faculty:"); 
scanf("%s", s->faculty); 
printf("Department:"); 
scanf("%s", s->department); 
printf("Age:"); 
scanf("%d", &s->age); 
printf("Grade:"); 
scanf("%d", &s->grade); 
students[count].age = s->age; 
students[count].grade=s->grade; 
strcpy(students[count].department,s->department); 
strcpy(students[count].faculty,s->faculty); 
strcpy(students[count].name,s->name); 
strcpy(students[count].surname, s->surname); 
free_list(s); 
} 

void displayList(int count) { 
int i; 
for (i = 0; i < count; i++) { 
    if(students[i].name[0] != "\0" && students[i].surname[0] != "\0" && students[i].faculty[0] !=  "\0" && students[i].department[0] !="\0"&&students[i].age != 0 && students[i].grade != 0) 
    { 
     printf("%d.) %s %s %s %s %d %d \n", i + 1, students[i].name, 
     students[i].surname, students[i].faculty, 
     students[i].department, students[i].grade, students[i].age); 
    } 

} 
} 
void free_list(STUDENT s) { 

free(s); 
} 
void deleteStudent(int index,int count) { 
int i; 
for(i=0;i<count;i++) 
{ 
    if(index-1==i) 
    { 
     students[i].name[0]="\0"; 
     students[i].surname[0]="\0"; 
     students[i].department[0]="\0"; 
     students[i].faculty[0]="\0"; 
     students[i].age=0; 
     students[i].grade=0; 
    } 
} 
displayList(count); 
} 
void *data_init() 
{ 
STUDENT s=(STUDENT)malloc(sizeof(STUDENT_STRUCT)); 
return s; 
} 
void Choice() { 
STUDENT s; 
int a=0; 
printf("Enter your choice to do with a program\n"); 
printf("Press A for adding student\n"); 
printf("Press L to display a student list\n"); 
printf("Press D for deleting student\n"); 
printf("Press E for exit\n"); 
char choice = ' '; 
int index; 
while (choice != 'E') { 

    printf("Your choice:"); 
    scanf("%c", &choice); 
    switch (choice) { 
    case 'A': 
     s=data_init(s); 
     addStudent(a,s); 
     a++; 
     break; 
    case 'L': 

     displayList(a); 
     break; 
    case 'D': 
     printf("Enter an index:"); 
     scanf("%d ",index); 
     deleteStudent(index,a); 
     break; 
    } 
} 

exit(1); 
} 

我得到分段错误(代码转储)错误,当程序试图运行在交换机的情况下删除功能。在这段代码中我的错在哪里,我想它是关于指针的一切。但我尝试为每个学生分配和释放。问题在哪里,如果有人告诉我,我会感激。谢谢。

+0

而且,我的main()调用了Choice()函数来运行程序。对不起这是我的错。 – 2014-11-04 19:04:41

+0

@ user3121023这应该是一个答案,而不是评论。 – 2014-11-04 19:10:43

回答

1

我首先尝试在做任何事情之前检查索引是否在0和count之间。这可能会导致错误。另外,你似乎没有用#endif关闭头文件中的#ifndef。

也有人指出,scanf应该给一个地址,而不是一个变量。例如:

scanf("%d ", &z); 
+0

编辑:我应用这些步骤后不再得到分段错误,但程序停留在删除()我无法得到任何输出 – 2014-11-04 19:32:14

+0

在这一点上,我会抛出一些printf()s在那里,看看哪里问题正在出现。它在删除循环中吗?它有没有找到正确的元素?循环退出? displayList()中的问题是否为“已删除”的项目(清零可能更合适) – paulr 2014-11-05 00:58:42