我的任务是创建一个库存管理程序,用户可以在其中添加项目,编辑项目或删除项目。代码几乎完成了,删除项目时遇到了一个问题,特别是从结构数组中删除了一个元素。
我已经在寻找类似的问题,并尝试了建议的解决方案。我在代码中尝试的方法是通过将数组中的元素向下移动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的新手,如果您看到一些有问题的代码,我真的很抱歉。我正在努力。
答案 0 :(得分:2)
一个问题是,在使用i == n
为数组建立索引之后,对{1}}的检查已经完成。要解决此问题,您应该在检查前 前增加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
}
为零的情况。一般来说,我认为n
比while(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
}
返回的值