2016-03-05 80 views
0

我是一名初学者,我正在尝试使用库管理系统thingy,它出现错误出现(Debug Assertion Failed),并且表达式为(file_name!= nullptr )。调试断言失败(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); 
} 

调试断言失败!

计划:...发言:\的Visual Studio 2015年 \项目\ Project9 \调试\ Project9.exe文件: minkernel \ CRT显示器\ ucrt的\ src \ appcrt \标准输入输出\ fopen.cpp行:30

表达式:file_name!= nullptr

有关程序如何导致断言失败的信息,请参阅有关断言的Visual C++文档。

(按重试来调试应用程序)

+0

不相关,但'fflush(stdin)'是未定义的行为。 –

回答

1

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

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

0

断言告诉你它里面有什么,例如你的代码或代码中的某处存在这个断言。

assert(file_name != nullptr); 

基于您的代码,它看起来像你调用一些用户输入后的功能,但你还没有验证或检查输入(危险)。 AddNewBook的声明也看起来很奇怪即哪来的类型,即

int AddNewBook(librecord); 

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

FILE *librecord; 

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