当我使用“删除”功能时程序挂起

时间:2013-10-29 23:27:47

标签: c arrays

我正在尝试编写一个程序,它会从用户那里获取信息,用户可以选择做什么。选项是添加,修改,删除,显示某些信息,查找平均值,然后退出。 我已经为所有这些代码编写了代码,但我无法使用我的删除功能。 这是我的代码:

void delete_student(struct students *list, int *count)                  //Delete's Selected student
{
    int id4;
    int k;
    if (*count != 0)
    {
    printf("\nEnter the ID of the student you wish to delete: ");
    scanf("%d\n", &id4);
    for (int i = 0; i < *count; i++)                //Searches for the selected student
    {
        k = i;
        if (list[i].id == id4)
        {
            printf("\nStudent found.\nDeleting...\n");
            for (int c = k; c < *count; c++)            //Deletes the student if found
            {
                list[c].id = list[c + 1].id;
                strcpy(list[c].name, list[c + 1].name);
                list[c].age = list[c + 1].age;
                strcpy(list[c].dept, list[c + 1].dept);
                list[c].grade = list[c + 1].grade;
            }
            *count = *count - 1;
            printf("\nDeletion Complete.\n");
            break;
        }
        else
            printf("\nStudent not found. Please try again.\n");
        break;
    }
}
else
    printf("\nNo student's to delete.\n");
}

编辑: 当我通过程序,并选择使用此功能时,它会询问我“ID”,然后它什么都不做,并且光标闪烁。

有人能告诉我我做错了什么吗? 如果需要,可以使用更多代码。

这是最后一个元素的删除方式:

list[*count].id = 0;
strcpy(list[*count].name, NULL);
list[*count].age = 0;
strcpy(list[*count].dept, NULL);
list[*count].grade = 0;

4 个答案:

答案 0 :(得分:1)

break循环结束时,您可能不应该有for语句。只需删除那个。

else
        printf("\nStudent not found. Please try again.\n");
    break;
}     ^
      |
      +------ this one

printf也有点不准确;它将在循环的每次迭代中打印出来,而您没有找到匹配的ID。

答案 1 :(得分:1)

您的scanf()语句的格式字符串不正确。您不需要添加尾随换行符; scanf照顾它。将该行更改为scanf("%d", &id4);(无新行),它应该有效 我刚刚编写了一个小的存根程序,用于比较带有和不带换行符的scanf,它会复制你的错误。

答案 2 :(得分:1)

这个循环:

for (int c = k; c < *count; c++) 

应该是:

for (int c = k; c < *count - 1; c++)

如上所述,它在有效数组的末尾读取一个。结果未定义。特别是,strcpy电话可能会非常糟糕。当它到达该循环中的最后一个条目时,list[c+1]引用一个不存在的条目(基于* count)。

答案 3 :(得分:0)

scanf因为永远无法读取您的号码而挂起。不需要\n。仅使用%d