背景:我们在图书馆。我们写了两个结构: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;
}
答案 0 :(得分: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中完成此操作)。
答案 1 :(得分: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
指针的使用。)
此外:为什么使用双分号;;
?