我的c程序在运行时不断崩溃';开始了

我的c程序在运行时不断崩溃';开始了,c,crash,C,Crash,我正在为一个简单的库编写一个c程序,但由于某种原因,该程序在启动时一直崩溃。就像有一个菜单显示,但它甚至没有出现它只是崩溃。有人能帮我吗 struct library { char name[50]; int id; int qty; }books[50],copy[50],delet[50],sort[50]; int i=0; FILE *mybooks; int main() { int choice; char ans; int id;

我正在为一个简单的库编写一个c程序,但由于某种原因,该程序在启动时一直崩溃。就像有一个菜单显示,但它甚至没有出现它只是崩溃。有人能帮我吗

struct library
{
    char name[50];
    int id;
    int qty;
}books[50],copy[50],delet[50],sort[50];
int i=0;
FILE *mybooks;

int main()
{
    int choice; char ans;
    int id;
    int qty;
    int s,o=0,j=0;
    char name[50];
    mybooks=fopen("D:\\mybooks.txt","r");
    if (mybooks == NULL) printf("Error. File not found.");
    else
    {
        while(!feof(mybooks))
        {
            fscanf(mybooks,"%[^\n] %d %d",books[i].name,&books[i].id,&books[i].qty);
            strcpy(copy[i].name,books[i].name);
            copy[i].id=books[i].id;
            copy[i].qty=books[i].qty;
            i++;
        }
        fclose(mybooks);
    }
    printf("Welcome to the Library.\n");
    do
    {

        printf("Please choose an option:\n");
        printf("1.Insert a book\n");
        printf("2.Delete a book\n");
        printf("3.Search a book by ID\n");
        printf("4.Search a book by name\n");
        printf("5.Display all books (sorted by name)\n");
        printf("6.Display all books (unsorted)\n");
        scanf("%d",&choice);
        switch (choice){
        case 1:
            printf("You will need to enter a name, ID, and quantity of the book.\n");
            printf("please enter book name:");
            fflush(stdin);
            fgets(name,sizeof name,stdin);
            printf("please enter book ID:");
            scanf("%d",&id);
            printf("please enter book quantity:");
            scanf("%d",&qty);
            InsertBook(name,id,qty);
            printf("your book has been added successfully\n");
            break;
        case 2:
            printf("Please enter book ID:");
            scanf("%d",&id);
            DeleteBook(id);
            printf("book successfully deleted.\n");
            break;
        case 3:
            printf("Please enter ID of Book:");
            scanf("%d",&id);
            s=LinearSearch(id,j);
            if (s>=0)
            {
                printf("Book Found.\n");
                printf("Name:%s",books[s].name);
                printf("ID:%d\n",books[s].id);
                printf("Quantity:%d\n",books[s].qty);
            }
            else
                printf("Sorry, the book doesn't exist.\n");
            break;
        case 4:
            printf("Please enter name of book:");
            fflush(stdin);
            gets(name);
            sorting();
            s=BinarySearch(name,0,i);
            printf("Book Found.\n");
            printf("ID:%d\n",sort[s].id);
            printf("Quantity:%d\n",sort[s].qty);
            break;
        case 5:
            sorting();
            while (o<i);
            {
                printf("%s\n",sort[o].name);
                o++;
            }
            printf("\n");
            break;
        case 6:
            while(o<i)
            {
                printf("%s",books[o].name);
                o++;
            }
            break;
        default:
            printf("Invalid Choice. Please try again.\n");
            break;
        }
        printf("do you want to choose another option?(y/n)  ");
        scanf(" %c",&ans);
    }while(ans == 'y');
}
结构库 { 字符名[50]; int-id; 整数数量; }书籍[50],复制[50],删除[50],分类[50]; int i=0; 档案*我的书; int main() { int选择;char-ans; int-id; 整数数量; int s,o=0,j=0; 字符名[50]; mybooks=fopen(“D:\\mybooks.txt”、“r”); 如果(mybooks==NULL)printf(“Error.File not found.”); 其他的 { 而(!feof(mybooks)) { fscanf(mybooks,“%[^\n]%d%d”,books[i].name,&books[i].id,&books[i].qty); strcpy(副本[i]。名称,书籍[i]。名称); 复制[i].id=books[i].id; 复制[i]。数量=书籍[i]。数量; i++; } fclose(mybooks); } printf(“欢迎来到图书馆。\n”); 做 { printf(“请选择一个选项:\n”); printf(“1.插入一本书”); printf(“2.删除一本书”\n); printf(“3.按ID搜索图书\n”); printf(“4.按书名搜索\n”); printf(“5.显示所有书籍(按名称排序)\n”); printf(“6.显示所有书籍(未排序)\n”); scanf(“%d”,选择(&C); 开关(选择){ 案例1: printf(“您需要输入图书的名称、ID和数量。\n”); printf(“请输入图书名称:”); fflush(stdin); fgets(名称、名称尺寸、标准尺寸); printf(“请输入图书ID:”); scanf(“%d”和&id); printf(“请输入图书数量:”); 扫描频率(“%d”和数量); InsertBook(名称、id、数量); printf(“您的书已成功添加\n”); 打破 案例2: printf(“请输入图书ID:”); scanf(“%d”和&id); DeleteBook(id); printf(“图书已成功删除。\n”); 打破 案例3: printf(“请输入图书ID:”); scanf(“%d”和&id); s=线性搜索(id,j); 如果(s>=0) { printf(“找到书。\n”); printf(“名称:%s”,书籍[s]。名称); printf(“ID:%d\n”,图书[s].ID); printf(“数量:%d\n”,书籍[s]。数量); } 其他的 printf(“对不起,这本书不存在。\n”); 打破 案例4: printf(“请输入图书名称:”); fflush(stdin); 获取(名称); 排序(); s=二进制搜索(名称,0,i); printf(“找到书。\n”); printf(“ID:%d\n”,排序[s].ID); printf(“数量:%d\n”,排序[s]。数量); 打破 案例5: 排序();
(o在对输入文件执行任何i/o之前,您已经测试了文件结束条件。然后,当您使用
fscanf()
执行i/o时,您没有测试结果以查看变量是否已成功读取

发生的情况是scanf()可能失败了,并且您没有到达循环的末尾,即EOF条件。您会被卡在那里,直到您的一个作业(
strcpy(copy[i].name,books[i].name);
copy[i].id=books[i].id;
copy[i].qty=books[i].qty;
)最终导致溢出

要验证这一点,请在调试器中运行代码


使用
fscanf()
非常棘手,请始终彻底测试它。

在对输入文件执行任何i/o之前,您已经测试了文件结束条件。然后,当您使用
fscanf()
执行i/o时,您没有测试结果以查看是否成功读取了变量

发生的情况是scanf()可能失败了,并且您没有到达循环的末尾,即EOF条件。您会被卡在那里,直到您的一个作业(
strcpy(copy[i].name,books[i].name);
copy[i].id=books[i].id;
copy[i].qty=books[i].qty;
)最终导致溢出

要验证这一点,请在调试器中运行代码


使用
fscanf()
非常棘手,请始终彻底测试它。

另请参阅忽略scanf()的返回值和朋友,风险自负。这通常有助于调试。如果失败,请报告所有返回值。注意:返回值,而不是扫描值。在读取文件数据时,您没有检查数组边界。即使您认为您已为未卸载的
书籍[]定义了正确的数组大小
由于不正确使用了
feof
,有一条记录额外。此外,还有其他基本检查未进行。
%[^\n]
将直接读取下两个
%d
数据项,如果它们在同一行上,您将不知道,因为您没有检查
fscanf的返回值,它可能会打破字符串数组大小的限制:
%[^\n]
应该是
%49[^\n]
或小于数组长度1的任何值。此外,它也不推荐使用,因为它可能导致缓冲区溢出。另请参见忽略scanf()的返回值和朋友,风险自负。这通常有助于调试。如果失败,请报告所有返回值。注意:返回值,而不是扫描值。在读取文件数据时,您没有检查数组边界。即使您认为您已为未卸载的
书籍[]定义了正确的数组大小
由于不正确使用了
feof
,有一条记录额外。此外,还有其他基本检查未进行。
%[^\n]
将直接读取下两个
%d
数据项,如果它们在同一行上,您将不知道,因为您没有检查
fscanf
的返回值,它可能是