带有指针作为参数的数组的函数

问题描述 投票:0回答:2

背景:我们在图书馆。我们写了两个结构:Livre(英文书),titre(标题),nombre_pages(页数)和statut(已经或者已经借过?)

Lecteur(读者)(nom = name; prenom = firstname; nb_livres =读者已预订的书籍数量;以及结构livres)

我正在尝试做一个函数,其中的参数是:1)具有不同读者的数组(结构Lecteur)2)数组的大小(带有指针,因为它将演变)3)读者(结构Lecteur)有要删除数组。

这是我的功能:

    #include <stdio.h>

struct Livre {
    char titre[100];
    int nombre_pages;
    int statut; // Book already borrowed = 1, Available = 0
};

struct Lecteur {
    char nom[100];
    char prenom[100];
    int nb_livres; // le nombre de livres dans le tableau "livres"
    struct Livre* livres[100]; // livres deja empruntes (eventuellement rendus)

};

void desabonnement(struct Lecteur * plecteurs[], int * nombre_lecteurs,
  struct Lecteur * lect) {

  struct Lecteur empty = {  // Cette variable me permettra de transformer la valeur qui m'intérésse pas
    0
  };
  int i = 0;
  int j = 0;

  while ((plecteurs[i]->nom != lect->nom) &&
    (plecteurs[i]->prenom != lect->prenom)) {
    i++;
  }
  while (j < plecteurs[i]->nb_livres) {
    plecteurs[i]->livres[j]->statut = 0;
    j++;
  }
  while (i < * nombre_lecteurs) {
    *plecteurs[i] = *plecteurs[i + 1];
    i++;
  }

  *plecteurs[i] = empty;

}



int main() {

    struct Livre l1 = { "boom" , 50 , 1 };
    struct Livre l2 = { "bim" , 50 , 1 };
    struct Livre l3 = { "chaud" , 50 , 0 };
    struct Livre l4 = { "tcho" , 50 , 1 };
    struct Livre l5 = { "braa" , 50 , 1 };

    struct Livre *p1 = & l1;
    struct Livre *p2 = & l2;
    struct Livre *p3 = & l3;
    struct Livre *p4 = & l4;
    struct Livre *p5 = & l5;





    struct Lecteur le1 = { "Boso" , "Nen" , 2 , {&l1, &l2} };;
    struct Lecteur le2 = { "Jogar" , "Elo" , 1 , {&l3} };;
    struct Lecteur le3 = { "marche" , "silteplait" , 2 , {&l4, &l5} };;


    struct Lecteur *tableau_test[3] = {&le1, &le2, &le3};
    int le_nombre = 3;


    desabonnement(tableau_test, &le_nombre, &le3);


        printf(" %d ", tableau_test[0]->nb_livres);




    return 0;
}
c arrays pointers structure function-pointers
2个回答
2
投票

问题在于while (i < * nombre_lecteurs)函数的void desabonnement(struct Lecteur * plecteurs[], int * nombre_lecteurs, struct Lecteur * lect)。这应该是while (i+1 < * nombre_lecteurs)

查看完整的工作代码here

注意:在您的实际代码中,您应该在删除完成时减少le_nombre以反映新的大小(我已在corrected code here中完成此操作)。


0
投票

其实你的问题是什么?

只是一些评论:

首先,我认为(plecteurs[i]->nom != lect->nom)strcmp(plecteurs[i]->nom, lect->nom) != 0的简写。同样适用于prenom。你应该纠正这个。

片段

while (j < plecteurs[i]->nb_livres) {
    plecteurs[i]->livres[j]->statut = 0;
    j++;
}

使书籍可用而不返回它们。对我来说,这似乎是不合逻辑的,因为读者可能没有给这本书回馈。但这可能符合你正在做的(家庭作业?)作业。请注意,书籍数组可能包含您的代码忽略的漏洞。当书籍退回时,是否所有书籍都打包到数组的开头?换句话说,是

struct Lecteur le4 = { "murche" , "silmeplait" , 2 , {&l4, 0, &l5} };

无效?

我没有测试你的功能,但是第一个肤浅的外观似乎应该编译并使用strcmp() - 校正它可以像你期望的那样运行。 (你的null-lector无效,学习使用NULL指针)。

此外:你为什么使用双分号;;

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.