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);//打印借完书后的新书单 } }这段代码怎么改
时间: 2024-03-24 20:40:07 浏览: 59
这段代码存在一个问题:如果要删除的书是最后一本书,则在执行 `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);//打印借完书后的新书单
}
}
```
这样修改后,当要删除的书是最后一本书时也能正常运行,不会出现越界的问题。同时,当书库里找不到要删除的书时,也不会执行删除操作,避免了不必要的错误。
阅读全文