我是初学者,我正在尝试使用图书馆管理系统,并且出现错误(Debug Assertion Failed
),表达式为(file_name!= nullptr)。
当我进入主菜单时,当我选择第一个选项时,出现此错误,所以我需要帮助,谢谢:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNING
int AddNewBook(librecord);
int Exit();
struct
{
int id;
char title;
char edition;
int year;
char location;
char price;
int status;
}book;
FILE *librecord;
char book_id;
char book_title;
char book_edition;
char book_year;
char book_location;
char book_price;
char confirmation;
int no_value;
int main(void)
{
printf(" ** *** *** ********** \n");
printf(" ** **** **** ********** \n");
printf(" ** ** ** ** ** *** \n");
printf(" ** ** ** ** ** ********** \n");
printf(" ** ** ** ** ** *** \n");
printf(" ******* ** **** ** ********** \n");
printf(" ******* ** ** ** ********** \n");
printf("\n");
printf(" Welcome to Library Management System \n");
printf("\n");
printf(" MAIN MENU \n");
printf("\n");
printf(" 1. Add New Book \n");
printf(" 2. Edit Book Information \n");
printf(" 3. Delete Book \n");
printf(" 4. View Book List \n");
printf(" 5. Book Check-In \n");
printf(" 6. Book Check-Out \n");
printf(" 7. Search \n");
printf(" 8. Exit \n");
int choice;
printf("\n Please enter a number: ");
scanf_s("%d", &choice);
switch(choice)
{
case 1:
system("cls");
AddNewBook(librecord);
break;
case 8:
Exit();
default:
printf("Wrong Input !!! Please re-enter a number!!! \n");
system("pause");
system("cls");
main();
}
}
int AddNewBook(FILE *librecord)
{
librecord = fopen(librecord, "ab+");
printf("\n");
printf(" ADD NEW BOOK \n");
printf("\n");
printf(" Book ID: ");
scanf_s(" %d", &book.id);
fflush(stdin);
strcpy(book.id, book_id);
printf("\n Title: ");
scanf_s(" %s", &book.title);
fflush(stdin);
strcpy(book.title, book_title);
printf("\n Edition: ");
scanf_s(" %s", &book.edition);
fflush(stdin);
strcpy(book.edition, book_edition);
printf("\n Year of Publication: ");
scanf_s(" %d", &book.year);
fflush(stdin);
strcpy(book.year, book_year);
printf("\n Shelf Location: ");
scanf_s(" %s", &book.location);
fflush(stdin);
strcpy(book.location, book_location);
printf("\n Price(RM): ");
scanf_s(" %s", &book.price);
fflush(stdin);
strcpy(book.price, book_price);
printf("Confirm? (Y/N) \n");
scanf("%c", &confirmation);
}
int Exit()
{
exit(0);
}
Debug Assertion失败!
程序:... ments \ Visual Studio 2015 \ Projects \ Project9 \ Debug \ Project9.exe文件: minkernel \ crts \ ucrt \ src \ appcrt \ stdio \ fopen.cpp行:30
表达式:file_name!= nullptr
有关程序如何导致断言失败的信息, 请参阅关于断言的Visual C ++文档。
(按“重试”调试应用程序)
答案 0 :(得分:1)
该消息告诉您已将NULL
文件名传递给fopen
。实际上,librecord
是一个未初始化的静态变量,其值最初为NULL
。 (断言是对编程错误的测试;您不应该将NULL
作为文件名传递。)
使用合适的文件名初始化librecord
或在程序执行期间指定文件名,然后再打开文件。 (打开文件后,检查是否成功。你不能依赖你的dta基本文件实际存在和可读。)
答案 1 :(得分:0)
断言告诉你其中的内容,即你在代码或代码中的某个地方存在这个断言。
assert(file_name != nullptr);
根据您的代码,您似乎在某些用户输入后调用了某个功能,但您尚未验证或检查输入(危险)。 AddNewBook的声明看起来也很奇怪,即类型即
int AddNewBook(librecord);
会给我各种警告,因为没有声明librecord,它是一个类型,一个宏还是什么?您稍后使用...
在文件中声明它FILE *librecord;
您需要显示所有代码或至少以某种方式最小化问题。提供的代码不会在我的机器上编译,更不用说了。