从结构数组中删除元素

时间:2019-07-04 05:59:25

标签: c

我的任务是创建一个库存管理程序,用户可以在其中添加项目,编辑项目或删除项目。代码几乎完成了,删除项目时遇到了一个问题,特别是从结构数组中删除了一个元素。

我已经在寻找类似的问题,并尝试了建议的解决方案。我在代码中尝试的方法是通过将数组中的元素向下移动1来删除数组中的元素。程序运行,并且假设该代码应该可以运行,但是每次我运行程序并输入“删除项目”选项时, ,程序停止运行(它不仅退出,它还说“程序停止运行”,这意味着我违反了规则或其他规定)。我想我可能超出了数组的大小,但我无法指出问题到底出在哪里。是禁止在结构数组中移动元素,还是仅仅是我的代码?请帮忙。

这是我的结构代码。

struct details {
    char name[30];
    double price;
    int code;
    int qty;
};


details item[SIZE];

这是主要功能:

int main (){



    int choice; //gets the choice of user from the menu
    bool condition = 1; //loops the menu
    int count=0; //counts the number of items in the inventory

    do{
        printheader(); //prints the title of the program
        printmenu(); //prints the menu (list of commands)
        scanf("%d", &choice);
        switch(choice){
            case 1: system("cls");
                    AddItem(count); //function in adding record
                    count++; //increments every time a new item is added
                    system("PAUSE");
                    system("cls");
                    break;
            case 2: system("cls");
                    EditItem(count); //function in editing a record
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 3: system("cls");
                    count = DeleteItem(count); //function in deleting a record
                    system("PAUSE"); 
                    system("cls");
                    break;          
            case 4: system("cls");
                    //ViewItem(); //function in viewing a record
                    system("PAUSE"); 
                    system("cls");
                    break;  
            case 5: system("cls");
                    DisplayInventory(count); //function in displaying inventory
                    system("PAUSE");
                    system("cls");
                    break;
            case 6: system("cls");
                    SaveFile(count); //function in saving the records to a file
                    system("PAUSE");
                    system("cls");
                    break;
            case 7: system("cls");
                    count = LoadFile(); //function in loading the records from a saved file
                    system("PAUSE");
                    system("cls");
                    break;
            case 8: printf("\nThank you!");
                    exit(0); //ends the program
                    break;
            default: printf("\nInvalid Input!\n");  
                     getch();
                     system("cls");     

        }
    }while(condition = 1);


    return 0;
}

这是DeleteItem()函数。它接受n,即项目/记录的数量。

int DeleteItem (int n){
    printheader();
    int i=0, code, pos;
    bool cont = true;
    printf("\nEnter the code of the item you want to delete: ");
    scanf("%d", code);
    do{
        if(code==item[i].code){ 
            for (pos=i; pos<(n-1); pos++){ 
            //  item[pos].name = item[pos+1].name; //this basically deletes the i'th element and shifts the remaining ones
                item[pos].price = item[pos+1].price;
                item[pos].code = item[pos+1].code;
                item[pos].qty = item[pos+1].qty;            
            }
            printf("\nItem deleted!");
            cont = false; //loop ends once the input of the user matches the data in the inventory
        }


        if(i==n){
            printf("\nCode not found!\n\n");
            cont = false; //loop ends when there are no matches
        }

        i++;

    }while(cont);   

}

在程序中输入“删除项目”选项时,程序会要求用户提供项目代码。然后,程序会在结构数组中扫描与代码匹配的元素(item [i] .code)。理想情况下,如果代码匹配,则程序应删除该元素并转移其他元素。但是,发生的是程序崩溃并停止。我需要帮助以找出问题所在。非常感谢你!

编辑 DeleteItem函数:

int DeleteItem (int n){
    printheader();
    int i=0, code, pos;
    //bool cont = true;
    printf("\nEnter the code of the item you want to delete: ");
    scanf("%d", code);
    while(i<n){
        if(code==item[i].code){ 
            for (pos=i; pos<(n-1); pos++){ 
                item[pos] = item[pos+1];            
            }
            printf("\nItem deleted!");
            break;; //loop ends once the input of the user matches the data in the inventory
        }

        i++;

        if(i==(n-1)){
            printf("\nCode not found!\n\n");
            break;; //loop ends when there are no matches
        }


    }   

    return (n-1);
}

我是C的新手,如果您看到一些有问题的代码,我真的很抱歉。我正在努力。

1 个答案:

答案 0 :(得分:2)

一个问题是,在使用i == n为数组建立索引之后, 前增加i。喜欢:

i

另一个问题是,您无法处理 i++; // Increment first if(i==n){ // then check printf("\nCode not found!\n\n"); cont = false; //loop ends when there are no matches } 为零的情况。一般来说,我认为nwhile(i < n) { ... };更好。

还请注意此代码(当前已注释掉)是错误的:

do { ...} while(...);

您不能使用赋值(即// item[pos].name = item[pos+1].name; )来复制字符串。您需要使用=

删除项目后,我也看不到strcpy的任何更新。我猜这是个错误...我认为count必须递减。

最后,我看不到该函数返回任何值。这也是一个错误,因为您定义了返回count的函数。

注释...

使用int之类的标志来终止cont循环会很好用,因此不是错误。但是,您实际上并不需要标记。您可以使用while之类的

break

或仅执行do{ ... ... if(i==n){ printf("\nCode not found!\n\n"); break; //loop ends when there are no matches } i++; }while(1); ,因为该函数无所事事。

编辑

OP已发布该代码的第二个修订版。此编辑地址是第二个修订版本。

第二个修订版的一个问题是代码总是返回return。即使没有找到“代码”,也可以这样做。那是个错误。

n-1也是错误的,因为这意味着将永远不会测试项目编号if(i==(n-1)){

尝试这样的方法:

n-i

顺便说一句:您应始终检查int DeleteItem (int n){ printheader(); int i=0, code, pos; printf("\nEnter the code of the item you want to delete: "); scanf("%d", code); while(i<n){ if(code==item[i].code){ for (pos=i; pos<(n-1); pos++){ item[pos] = item[pos+1]; } printf("\nItem deleted!"); return n-1; // End the function and return n-1 as an item was deleted } i++; } printf("\nCode not found!\n\n"); return n; // End the function and return n as no item was deleted } 返回的值