由于我有幾個成員告訴我發布整個程式,我將發布整個程式,以便您執行它。
在這個程式中,我希望能夠注冊汽車零件并更改庫存余額。
現在到了這個問題。每個函式本身都運行良好,當我將 searchIt() 函式呼叫到 changeIn() 函式時,問題就開始了。我需要 searchIt() 以便在修改其庫存余額之前搜索該專案。
問題:
每當我搜索一件物品并更改該物品的庫存時,它都會在每件物品上發生變化。
在選單中,如果我選擇 (3) 更改庫存余額,然后搜索不存在的專案,它不會告訴我“錯誤的專案編號”而是退出程式。
庫存余額變為負數。
#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;
}
```
uj5u.com熱心網友回復:
這個:
void changeIn(Car a[], int n)
{
int input;
int i;
searchIt(a, i);
將未初始化的暫存器長度傳遞給,searchIt()可能導致它超出范圍。然后它丟棄 的回傳值,然后使用仍未初始化的索引到陣列中。不好。它應該是:searchIt()i
void changeIn(Car a[], int n)
{
int input;
const int i = searchIt(a, n);
編輯:
正如您在評論中指出的那樣,是的,回圈changeIt()沒有意義;您不想更改多個元素,因此無需回圈。回圈是為了表達重復,這里沒有必要。
它應該只是:
a[i].inventory = input;
if (a[i].inventory < 0)
a[i].inventory = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530469.html
標籤:C
