调试断言失败(file_name!= nullptr)

时间:2016-03-05 06:09:30

标签: c visual-studio-2015

我是初学者,我正在尝试使用图书馆管理系统,并且出现错误(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 ++文档。

     

(按“重试”调试应用程序)

2 个答案:

答案 0 :(得分:1)

该消息告诉您已将NULL文件名传递给fopen。实际上,librecord是一个未初始化的静态变量,其值最初为NULL。 (断言是对编程错误的测试;您不应该将NULL作为文件名传递。)

使用合适的文件名初始化librecord或在程序执行期间指定文件名,然后再打开文件。 (打开文件后,检查是否成功。你不能依赖你的dta基本文件实际存在和可读。)

答案 1 :(得分:0)

断言告诉你其中的内容,即你在代码或代码中的某个地方存在这个断言。

assert(file_name != nullptr);

根据您的代码,您似乎在某些用户输入后调用了某个功能,但您尚未验证或检查输入(危险)。 AddNewBook的声明看起来也很奇怪,即类型即

int AddNewBook(librecord);

会给我各种警告,因为没有声明librecord,它是一个类型,一个宏还是什么?您稍后使用...

在文件中声明它
FILE *librecord;

您需要显示所有代码或至少以某种方式最小化问题。提供的代码不会在我的机器上编译,更不用说了。