c - 删除一个元素 C 中的结构体数组问题

标签 c arrays struct

我在删除 C 中结构数组的元素时遇到问题。所以,我有一个程序,有 2 个选项:添加和删除。问题是,当我从结构体数组中删除一个元素并添加另一个元素时,输出将显示我之前删除的元素,而我添加的新元素不会显示。我该如何解决这个问题?

这是我尝试制作的程序

#include "stdio.h"

struct itemlist
{
    char name[25];
    int quantity;
};

int main()
{
    int progress,processNum,i,sizeStruct = 0;
    struct itemlist items[105];
    printf("How many progress you want to do?\n");
    scanf("%d",&progress); getchar();

    for(i = 0; i < progress ; i++){
        scanf("%d",&processNum); getchar();        
        switch (processNum){
        case 1: // Add
            printf("Name of item :\n");
            scanf("%[^\n]",items[i].name); getchar();
            printf("How many items?:\n");
            scanf("%d",&items[i].quantity); getchar();
            sizeStruct++;
            printf("Success to add!!\n"); 
            break;
        case 2: // Delete from database, and its last index can be replaced.
            int index3;
            printf("Which index do you wanna delete?\n");
            scanf("%d",&index3); getchar();
            for(int k = index3-1; k < sizeStruct - 1; k++){
                items[k] = items[k + 1];
            }
            sizeStruct--;
            printf("Your item has been deleted.\n"); 
            break;
        }
    }
    // Print All last Items
    printf("Items: \n");
    for(int j = 0; j < sizeStruct; j++){
        printf("%s\n",items[j].name);
    }
    return 0;
}

这是输入和输出:

How many progress you want to do?
4
1
Name of item :
Cola-Cola
How many items?:
3
Success to add!!
1
Name of item :
Sprite
How many items?:
4
Success to add!!
2
Which index do you wanna delete?
2
Your item has been deleted.
1
Name of item :
Beer
How many items?:
8
Success to add!!
Items:
Cola-Cola // supposed to be Beer
Sprite

但是我的程序正在运行,但删除后我没有添加任何项目。如何解决这个问题?

最佳答案

您总是在位置 i 添加一个项目,但是当您删除一个项目时,您将数组向左移动一个位置,覆盖您要删除的项目,但您没有更新 i。 当你想删除第2项时,for循环

for(int k = index3-1; k < sizeStruct - 1; k++)

不会执行任何操作,因为 k=1,sizeStruct=2。这很好,因为“Sprite”之后没有项目可以覆盖它。但在此之后我会增加。因此你的数组最后看起来像这样

i   : 0         1      2           3
item: Cola-Cola Sprite /*Garbage*/ Beer

并且您只打印最后的前 2 项。

您可能需要在“case 2”内添加 i-=2,这样 i 就是应添加新项目的位置。 另请注意,在示例输入/输出中,当您删除第 2 项时,您会覆盖“Sprite”并添加“Beer”,因此预期输出为

Items:
Cola-Cola
Beer

关于c - 删除一个元素 C 中的结构体数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213273/

相关文章:

python - 创建一个数组,其中包含数组列表中的最大值

c - 为什么 'struct' 关键字必须在 C 中的结构实例之前?

C: union 体中结构域的位置

c - Netlink 导致内核 panic

C UDP组播接收包丢失

c++ - 如果未分配返回值,是否需要删除或释放动态数组?还是被函数删除了?

javascript - 在另一个对象 JavaScript 中搜索多个对象值

c - 在结构中没有得到正确的值

c - 在 C 中分配给 void 指针时

swift - 将结构数组分配给协议(protocol)数组