void deletebook(Book bookList[]) { char delete_bookname[30]; for(int j=0;j<numbooks;j++) { printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press); } printf("请输入要删掉的书名:"); scanf("%s",delet
时间: 2024-03-31 12:33:24 浏览: 53
e_bookname); int i=0; for(i=0;i<numbooks;i++) { if(strcmp(delete_bookname,bookList[i].name)==0) { for(int j=i;j<numbooks-1;j++) { bookList[j]=bookList[j+1]; } numbooks--; printf("删除成功!\n"); break; } } if(i==numbooks) { printf("未找到该书!\n"); } }
这是一个删除图书的函数,输入要删除的书名,函数会在 bookList 数组中查找该书,若找到则删除该书并提示删除成功,否则提示未找到该书。其中 bookList 是一个结构体数组,存储了图书的信息。请问,这个函数存在哪些问题?
相关问题
void deletebook(Book bookList[]) { char delete_bookname[30]; for(int j=0;j<numbooks;j++) { printf("%s.%s\t %s\t %s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);//打印借完书后的新书单 } printf("请输入要删掉的书名:"); scanf("%s",delete_bookname); for(int j=0;j<numbooks;j++) { if(strcmp(bookList[j].name,delete_bookname)==0)//书库里能找到该书 { strcpy(bookList[j].id,bookList[j+1].id); strcpy(bookList[j].name,bookList[j+1].name); strcpy(bookList[j].author,bookList[j+1].author); strcpy(bookList[j].press,bookList[j+1].press); } } for(int j=0;j<numbooks;j++) { printf("%s.%s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);//打印借完书后的新书单 } }这段代码怎么改
这段代码存在一个问题:如果要删除的书是最后一本书,则在执行 `strcpy` 时会出现越界的情况。为了避免这种情况,可以在删除时将最后一本书的信息覆盖到删除的书的位置上,然后将最后一本书的信息清空。
下面是修改后的代码:
```c
void deletebook(Book bookList[]) {
char delete_bookname[30];
for(int j = 0; j < numbooks; j++) {
printf("%s.%s\t %s\t %s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);//打印借完书后的新书单
}
printf("请输入要删掉的书名:");
scanf("%s",delete_bookname);
int delete_index = -1;
for(int j = 0; j < numbooks; j++) {
if(strcmp(bookList[j].name, delete_bookname) == 0) {
delete_index = j;
break;
}
}
if(delete_index != -1) {
numbooks--;
if(delete_index != numbooks) {
strcpy(bookList[delete_index].id, bookList[numbooks].id);
strcpy(bookList[delete_index].name, bookList[numbooks].name);
strcpy(bookList[delete_index].author, bookList[numbooks].author);
strcpy(bookList[delete_index].press, bookList[numbooks].press);
}
strcpy(bookList[numbooks].id, "");
strcpy(bookList[numbooks].name, "");
strcpy(bookList[numbooks].author, "");
strcpy(bookList[numbooks].press, "");
}
for(int j = 0; j < numbooks; j++) {
printf("%s.%s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);//打印借完书后的新书单
}
}
```
这样修改后,当要删除的书是最后一本书时也能正常运行,不会出现越界的问题。同时,当书库里找不到要删除的书时,也不会执行删除操作,避免了不必要的错误。
void deletebook(Book bookList[]) { char delete_bookname[30]; for(int j=0;j<numbooks;j++) { printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press); } printf("请输入要删掉的书名:"); scanf("%s",delete_bookname); for(int j=0;j<numbooks;j++) { if(strcmp(bookList[j].name,delete_bookname)==0) { strcpy(bookList[j].id,bookList[j+1].id); strcpy(bookList[j].name,bookList[j+1].name); strcpy(bookList[j].author,bookList[j+1].author); strcpy(bookList[j].press,bookList[j+1].press); numbooks--; printf("删除图书信息成功!\n"); break; } } for(int j=0;j<numbooks;j++) { printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press); } }怎么改正
这段代码的问题在于,在删除一本书籍之后,将后面所有书籍的信息向前移动,但是最后一本书籍的信息并没有被更新,导致输出时出现了重复信息。为了避免这种情况,我们可以将最后一本书籍的信息移到已删除的书籍位置,然后再将最后一本书籍的信息删除。修改后的代码如下:
```
void deletebook(Book bookList[]) {
char delete_bookname[30];
for(int j=0;j<numbooks;j++) {
printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);
}
printf("请输入要删掉的书名:");
scanf("%s",delete_bookname);
int delete_index = -1;
for(int j=0;j<numbooks;j++) {
if(strcmp(bookList[j].name,delete_bookname)==0) {
delete_index = j;
break;
}
}
if(delete_index != -1) {
strcpy(bookList[delete_index].id,bookList[numbooks-1].id);
strcpy(bookList[delete_index].name,bookList[numbooks-1].name);
strcpy(bookList[delete_index].author,bookList[numbooks-1].author);
strcpy(bookList[delete_index].press,bookList[numbooks-1].press);
numbooks--;
printf("删除图书信息成功!\n");
} else {
printf("没有找到该书籍!\n");
}
for(int j=0;j<numbooks;j++) {
printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press);
}
}
```
这样修改后,当删除一本书籍时,已删除的书籍信息将被最后一本书籍的信息覆盖,然后将最后一本书籍的信息删除,避免了重复输出的问题。
阅读全文