C语言 在一个函数内调用另一个函数时,未按预期执行

4si2a6ki  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(146)

因为我已经有几个成员告诉我张贴整个程序,我会张贴整个程序,所以你可以执行它。
在这个程序中,我希望能够登记汽车零件和改变库存余额。
现在来看看这个问题。每个函数本身都运行得很好,当我调用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;       
}
       ```
yzxexxkh

yzxexxkh1#

这一点:

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;

相关问题