因为我已经有几个成员告诉我张贴整个程序,我会张贴整个程序,所以你可以执行它。
在这个程序中,我希望能够登记汽车零件和改变库存余额。
现在来看看这个问题。每个函数本身都运行得很好,当我调用searchIt()函数来调用changeIn()函数时,问题就开始了。我需要searchIt(),这样我就可以在修改库存余额之前搜索项目。
问题:
1.每当我搜索一个项目,并改变该项目的库存,它改变了每一个项目。
1.在菜单中,如果我选择(3)更改库存余额,然后搜索一个不存在的项目,它不会告诉我“错误的项目编号”,而是退出程序。
1.库存现有量变为负数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXELENGTH 20
#define MAX 100
struct car{
int itemNmr;
char name[MAXELENGTH];
int inventory;
};
typedef struct car Car;
void registerArticle(Car a[], int *pN);
void print(Car a[], int n);
void changeIn(Car a[], int n);
int searchIt(Car a[], int n);
Car createIt(int itemNmr, char name[],int inventory){
Car c;
c.itemNmr = itemNmr;
strcpy(c.name, name);
c.inventory = inventory;
return c;
}
int main(){
Car reg[MAX];
int choice;
int nrOfIt=0;
while(1){
printf("(1)Register new pars\n(2)Display all parts\n(3)Change inventory\n(4)Search\n(5)Exit\n");
scanf("%d", &choice);
switch(choice){
case 1: registerArticle(reg, &nrOfIt);
break;
case 2: print(reg,nrOfIt);
break;
case 3: changeIn(reg,nrOfIt);
break;
case 4: searchIt(reg,nrOfIt);
break;
case 5: printf("Exit");
return 0;
default: printf("Try again!");
break;
}
} return 0;
}
void registerArticle(Car a[], int *pN){
int inventory;
int itemNmr;
char name[MAXELENGTH];
while(1){
printf("Item number(0 to exit): ");
scanf("%d%*c", &itemNmr);
if(itemNmr==0){
return;
}
printf("Name: ");
scanf("%s%*c", name);
printf("Inventory: ");
scanf("%d%*c", &inventory);
a[*pN]=createIt(itemNmr,name,inventory);
(*pN)++;
}
}
void print(Car a[], int n){
if(n==0){
printf("the list is empty\n");
}else{
for(int i=0;i<n;i++){
printf("%d\t\t%s\t\t%d\n", a[i].itemNmr, a[i].name, a[i].inventory);
}
return;
}
}
int searchIt(Car a[], int n){
while(1){
int itemN;
printf("Type item number: ");
scanf("%d", &itemN);
if(itemN==0){
break;
}
int found =0;
for(int i=0;i<n;++i)
{
if(itemN==a[i].itemNmr)
{
printf("%d\t\t%s\t\t%d\n", a[i].itemNmr, a[i].name, a[i].inventory);
return i;
break;
}
}
if(!found)
{
printf("Wrong item number!");
}
}
return 0;
}
void changeIn(Car a[], int n){
int input;
int i;
searchIt(a,i);
printf("Increase or decrease by: ");
scanf("%d", &input);
for(i=0;i<n;i++)
a[i].inventory += input;
if(a[i].inventory<0)
a[i].inventory = 0;
}
```
1条答案
按热度按时间yzxexxkh1#
这一点:
传递一个未初始化的寄存器长度给
searchIt()
,可能导致它 * 远远 * 超出界限。然后它丢弃searchIt()
的返回值,然后使用仍然未初始化的i
来索引数组。不好。它应该是:编辑:
正如您在评论中指出的,是的,
changeIt()
中的循环没有意义;你不想改变一个以上的元素,所以不需要循环。循环是用来表达重复的,在这里没有必要。它应该只是: