Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除C中结构问题的元素数组_C_Arrays_Struct - Fatal编程技术网

删除C中结构问题的元素数组

删除C中结构问题的元素数组,c,arrays,struct,C,Arrays,Struct,我在删除C中结构数组的一个元素时遇到问题。因此,我有一个程序有两个选项,添加和删除。问题是,当我从struct数组中删除一个元素并添加另一个元素时,输出将显示我以前删除的元素,而我添加的新元素没有显示。我如何解决这个问题 这是我试图制作的程序 #include "stdio.h" struct itemlist { char name[25]; int quantity; }; int main() { int progress,processNum,i,sizeSt

我在删除C中结构数组的一个元素时遇到问题。因此,我有一个程序有两个选项,添加和删除。问题是,当我从struct数组中删除一个元素并添加另一个元素时,输出将显示我以前删除的元素,而我添加的新元素没有显示。我如何解决这个问题

这是我试图制作的程序

#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;
}

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

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

对于(int k=index3-1;k 不会执行任何操作,因为k=1,sizeStruct=2。这很好,因为在“Sprite”之后没有项目可以覆盖它。但我会在这之后增加。因此,您的数组在末尾看起来是这样的

i   : 0         1      2           3
item: Cola-Cola Sprite /*Garbage*/ Beer
最后只打印前两项

您可能希望在“case2”中添加i-=2,因此i是应该添加新项的位置。 还请注意,在您的示例输入/输出中,当您删除项目2时,您会覆盖“Sprite”并添加“Beer”,因此预期输出为

Items:
Cola-Cola
Beer
Items:
Cola-Cola
Beer