0

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

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

4 回答 4

1

break在循环结束时有一个for可能不应该存在的语句。把那个删掉就行了。

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

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

于 2013-10-29T23:31:43.097 回答
1

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

于 2013-10-29T23:38:04.810 回答
1

这个循环:

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

应该改为:

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

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

于 2013-10-29T23:39:18.727 回答
0

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

于 2013-10-29T23:41:06.707 回答