ડꫀꫀ ꪗꪮꪊ. 2022-10-09 17:04 采纳率: 88.6%
浏览 48
已结题

C语言 管理系统 当我输入图书的名称之后 就无法继续下面的程序了 调试之后的结果如图 该怎么办呀?


#include <stdio.h>
#include<stdlib.h> 
#include <malloc.h>
#include <string.h>
#pragma warning(disable:4996) 
typedef struct //商品结构体
{
    char name[10];  //商品名称
    int time;//进货时间
    int year;//生产日期
    int no;//保质期
}goodstype;

typedef struct node
{
    goodstype data;  //存放商品信息
    struct node* next;  //指向下一个节点的指针
}goodslist;

int menu_select() //菜单函数 
{
    char c;
    do {
        system("cls"); //运行前清屏
        printf("商店存货管理系统\n"); //菜单选择
        printf("  1. 输入数据\n");
        printf("  2. 显示数据\n");
        printf("  3. 插入数据\n");
        printf("  4. 删除数据\n");
        printf("  5. 查找数据\n");
        printf("  6. 排序\n");
        printf("  7. 写入文件\n");
        printf("  8. 删除所有商品\n");
        printf("  0. 退出\n");
        printf("\n");
        printf("    请选择(0-8):");
        c = getchar(); //读入选择
    } while (c < '0' || c>'8');
    return(c - '0'); //返回选择
}
void delall(goodslist*& l)  //删除商品的全部记录
{
    FILE* fp;
    goodslist* p, * q;
    if ((fp = fopen("goods.dat", "wb")) == NULL)
    {
        printf("  提示:不能打开商品信息文件\n");
        return;
    }
    fclose(fp);
    p = l->next;
    if (p != NULL)
    {
        q = p->next;
        while (q != NULL)
        {
            free(p);
            p = q;
            q = q->next;
        }
        free(p);
        l->next = NULL;
    }
    else
        printf("  提示:不存在任何商品信息记录\n");
    printf("  提示:商品信息删除完毕\n");
    printf("\t\t\t");
    system("pause");
}
void readfile(goodslist*& l)  //读goods.dat文件建立商品信息单链表l
{
    FILE* fp;
    goodstype goods;
    goodslist* p, * r;
    int n = 0;
    l = (goodslist*)malloc(sizeof(goodslist));
    r = l;
    if ((fp = fopen("goods.dat", "rb")) == NULL)
    {
        if ((fp = fopen("goods.dat", "wb")) == NULL)
            printf("  提示:不能创建goods.dat文件\n");
        printf("\t\t\t");
        system("pause");
    }
    else
    {
        while (fread(&goods, sizeof(goodstype), 1, fp) == 1)
        {
            p = (goodslist*)malloc(sizeof(goodslist));
            p->data = goods;
            r->next = p;
            r = p;
            n++;
        }
    }
    r->next = NULL;
    printf("  提示:商品信息单链表l建立完毕,有%d个记录\n", n);
    fclose(fp);
    printf("\t\t\t");
    system("pause");

}
void savefile(goodslist* l)  //将商品信息单链表存入数据文件
{
    goodslist* p = l->next, * q;
    FILE* fp;
    if ((fp = fopen("goods.dat", "wb")) == NULL)
    {
        printf("  提示:不能创建文件goods.dat\n");
        printf("\t\t\t");
        system("pause");
        return;
    }
    while (p != NULL)
    {
        fwrite(&p->data, sizeof(goodstype), 1, fp);
        p = p->next;
    }
    fclose(fp);
    p = l;
    q = p->next;
    while (q != NULL)
    {
        free(p);
        p = q;
        q = q->next;
    }
    free(p);
    printf("  提示:所有商品信息记录成功写入到goods.dat文件中\n");
    printf("\t\t\t");
    system("pause");
}
void inputgoods(goodslist*& l)  //插入一条商品信息记录
{
    char x[10];
    goodslist* p;
    p = (goodslist*)malloc(sizeof(goodslist));
    printf("   商品名称:"); //交互输入 
    scanf_s("%s", &p->data.name);
    printf("   进货时间(例20070201):");
    scanf_s("%d", &p->data.time);
    printf("   生产日期(例20070201):");
    scanf_s("%d", &p->data.year);
    printf("   保质期(年):");
    scanf_s("%d", &p->data.no);
    //gets(x); //清除多余的输入
    p->next = l->next;
    l->next = p;
    printf("商品信息插入成功!\n");
    printf("\t\t\t");
    system("pause");
}
int inputall(goodslist*& l, int n)  //最初输入若干条商品信息记录
{
    int i = 0;
    goodslist* p;
    char sign='\0';
        char x[10];
    while (sign != 'n' && sign != 'N')
    {
        p = (goodslist*)malloc(sizeof(goodslist));
        printf("   商品名称:"); //交互输入 
        scanf_s("%s", &p->data.name);
        printf("   进货时间(例20070201):");
        scanf_s("%d", &p->data.time);
        printf("   生产日期(例20070201):");
        scanf_s("%d", &p->data.year);
        printf("   t保质期(年):");
        scanf_s("%d", &p->data.no);
        //gets(x); //清除多余的输入 
        p->next = l->next;
        l->next = p;
        printf("   继续输入?(Y/N)");
        scanf_s("%c", &sign); //输入判断
        i++;
    }
    printf("          商品信息输入成功!\n");
    printf("\t\t\t");
    system("pause");
    return(n + i);
}
void sorttime(goodslist*& l)  //采用直接插入法对单链表l按进货时间递增有序排序
{
    goodslist* p, * pre, * q;
    p = l->next->next;
    if (p != NULL)
    {
        l->next->next = NULL;
        while (p != NULL)
        {
            q = p->next;
            pre = l;
            while (pre->next != NULL && pre->next->data.time < p->data.time)
            {
                pre = pre->next;
            }
            while (pre->next != NULL && pre->next->data.time == p->data.time &&
                (pre->next->data.year + (pre->next->data.no) * 10000) < (p->data.year + (p->data.no) * 10000))
            {
                pre = pre->next;
            }
            p->next = pre->next;
            pre->next = p;
            p = q;
        }
    }
    printf("  提示:按进货时间递增排序完毕\n");
    printf("\t\t\t");
    system("pause");
}
/*int locategoods(goodslist *l,char a[])  //按商品名称查询返回商品位置
{
    int i=1;
    goodslist *p=l->next;
    printf("   请输入商品名称:");
    scanf("%s",a);
    while(p!=NULL&&strcmp(p->data.name,a)!=0)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return (0);
    else
        return(i);
}*/

void onlydisplay(goodslist* l, char a[])  //根据商品名称显示商品所有信息
{
    int i = 1;
    goodslist* p = l->next;
    printf("   请输入商品名称:");
    scanf_s("%s", a);
    while (p != NULL && strcmp(p->data.name, a) != 0)
    {
        p = p->next;
        i++;
    }
    if (p == NULL)
        printf("不存在该商品!\n ");
    else
    {
        printf("      名称    进货时间    生产日期    保质期\n");
        printf("   --------------------------------------------------\n");
        printf("  >> %s      %d      %d     %d\n", p->data.name, p->data.time, p->data.year, p->data.no);
        printf("   --------------------------------------------------\n");
    }
    printf("\t\t\t");
    system("pause");
}
void deletegoods(goodslist* l, char a[])  //根据商品名称删除商品所有信息
{
    int i = 1;
    int j = 0;
    goodslist* q = l, * s;
    goodslist* p = l->next;
    printf("   请输入要删除的商品名称:");
    scanf_s("%s", a);
    while (p != NULL && strcmp(p->data.name, a) != 0)
    {
        p = p->next;
        i++;
    }
    if (p == NULL)
        printf("不存在该商品!\n");
    else
    {
        while (j < i - 1 && q != NULL)
        {
            j++;
            q = q->next;
        }
        if (q == NULL)
            printf("不存在该商品!\n");
        else
        {
            s = q->next;
            if (s == NULL)
                printf("不存在该商品!\n");
            q->next = s->next;
            free(s);
            printf("商品删除成功!\n");
        }
        printf("\t\t\t");
        system("pause");
    }
    /*if(p==NULL)
    printf("不存在该商品!\n ");
    else
    {
        printf("      名称    进货时间    生产日期    保质期\n");
        printf("   --------------------------------------------------\n");
        printf("  >> %s      %d      %d     %d\n",p->data.name,p->data.time,p->data.year,p->data.no);
        printf("   --------------------------------------------------\n");
    }*/
}
void display(goodslist* l)   //输出所有商品信息
{
    goodslist* p = l->next;
    if (p == NULL)
        printf("  提示:没有任何商品信息记录\n");
    else
    {
        printf("      名称    进货时间    生产日期    保质期\n");
        printf("   --------------------------------------------------\n");
        while (p != NULL)
        {
            printf("  >> %s      %d      %d     %d\n", p->data.name, p->data.time, p->data.year, p->data.no);
            p = p->next;
        }
        printf("   --------------------------------------------------\n");
    }
    printf("\t\t\t");
    system("pause");
}
void main()
{
    goodslist* l;
    char a[10];
    printf("由goods.dat文件建立商品信息单链表l\n");
    readfile(l);
    int n = 0;
    for (;;)
    {
        switch (menu_select()) //选择判断
        {
        case 1:
            printf("输入最初商品\n"); //输入若干条记录 
            n = inputall(l, n);
            break;
        case 2:
            display(l);
            break;
        case 3:inputgoods(l);
            break;
        case 4:deletegoods(l, a);
            break;
        case 5:onlydisplay(l, a);
            break;
        case 6:    sorttime(l);
            break;
        case 7:    savefile(l);
            break;
        case 8:delall(l);
            break;
        case 0:
            printf("\t\t\t结束退出!\n");   //结束程序
            printf("\t\t\t");
            system("pause");
            exit(1);
        }
    }
}

img

img

  • 写回答

2条回答 默认 最新

  • 四海一叶秋 2022-10-09 19:33
    关注

    scanf_s的字符串有%s和%c时要提供长度参数。大概改了下,你看看有没问题:

    
    
    #include <stdio.h>
    #include<stdlib.h> 
    #include <malloc.h>
    #include <string.h>
    #pragma warning(disable:4996) 
    typedef struct //商品结构体
    {
        char name[10];  //商品名称
        int time;//进货时间
        int year;//生产日期
        int no;//保质期
    }goodstype;
    
    typedef struct node
    {
        goodstype data;  //存放商品信息
        struct node* next;  //指向下一个节点的指针
    }goodslist;
    
    int menu_select() //菜单函数 
    {
        char c;
        do {
            system("cls"); //运行前清屏
            printf("商店存货管理系统\n"); //菜单选择
            printf("  1. 输入数据\n");
            printf("  2. 显示数据\n");
            printf("  3. 插入数据\n");
            printf("  4. 删除数据\n");
            printf("  5. 查找数据\n");
            printf("  6. 排序\n");
            printf("  7. 写入文件\n");
            printf("  8. 删除所有商品\n");
            printf("  0. 退出\n");
            printf("\n");
            printf("    请选择(0-8):");
            c = getchar(); //读入选择
        } while (c < '0' || c>'8');
        return(c - '0'); //返回选择
    }
    void delall(goodslist*& l)  //删除商品的全部记录
    {
        FILE* fp;
        goodslist* p, *q;
        if ((fp = fopen("goods.dat", "wb")) == NULL)
        {
            printf("  提示:不能打开商品信息文件\n");
            return;
        }
        fclose(fp);
        p = l->next;
        if (p != NULL)
        {
            q = p->next;
            while (q != NULL)
            {
                free(p);
                p = q;
                q = q->next;
            }
            free(p);
            l->next = NULL;
        }
        else
            printf("  提示:不存在任何商品信息记录\n");
        printf("  提示:商品信息删除完毕\n");
        printf("\t\t\t");
        system("pause");
    }
    void readfile(goodslist*& l)  //读goods.dat文件建立商品信息单链表l
    {
        FILE* fp;
        goodstype goods;
        goodslist* p, *r;
        int n = 0;
        l = (goodslist*)malloc(sizeof(goodslist));
        r = l;
        if ((fp = fopen("goods.dat", "rb")) == NULL)
        {
            if ((fp = fopen("goods.dat", "wb")) == NULL)
                printf("  提示:不能创建goods.dat文件\n");
            printf("\t\t\t");
            system("pause");
        }
        else
        {
            while (fread(&goods, sizeof(goodstype), 1, fp) == 1)
            {
                p = (goodslist*)malloc(sizeof(goodslist));
                p->data = goods;
                r->next = p;
                r = p;
                n++;
            }
        }
        r->next = NULL;
        printf("  提示:商品信息单链表l建立完毕,有%d个记录\n", n);
        fclose(fp);
        printf("\t\t\t");
        system("pause");
    
    }
    void savefile(goodslist* l)  //将商品信息单链表存入数据文件
    {
        goodslist* p = l->next, *q;
        FILE* fp;
        if ((fp = fopen("goods.dat", "wb")) == NULL)
        {
            printf("  提示:不能创建文件goods.dat\n");
            printf("\t\t\t");
            system("pause");
            return;
        }
        while (p != NULL)
        {
            fwrite(&p->data, sizeof(goodstype), 1, fp);
            p = p->next;
        }
        fclose(fp);
        p = l;
        q = p->next;
        while (q != NULL)
        {
            free(p);
            p = q;
            q = q->next;
        }
        free(p);
        printf("  提示:所有商品信息记录成功写入到goods.dat文件中\n");
        printf("\t\t\t");
        system("pause");
    }
    void inputgoods(goodslist*& l)  //插入一条商品信息记录
    {
        char x[10];
        goodslist* p;
        p = (goodslist*)malloc(sizeof(goodslist));
        printf("   商品名称:"); //交互输入 
        scanf_s("%s", p->data.name,10);
        printf("   进货时间(例20070201):");
        scanf_s("%d", &p->data.time);
        printf("   生产日期(例20070201):");
        scanf_s("%d", &p->data.year);
        printf("   保质期(年):");
        scanf_s("%d", &p->data.no);
        //gets(x); //清除多余的输入
        p->next = l->next;
        l->next = p;
        printf("商品信息插入成功!\n");
        printf("\t\t\t");
        system("pause");
    }
    int inputall(goodslist*& l, int n)  //最初输入若干条商品信息记录
    {
        int i = 0;
        goodslist* p;
        char sign = '\0';
        char x[10];
        while (sign != 'n' && sign != 'N')
        {
            p = (goodslist*)malloc(sizeof(goodslist));
            printf("   商品名称:"); //交互输入 
            scanf_s("%s", p->data.name,10);
            printf("   进货时间(例20070201):");
            scanf_s("%d", &p->data.time);
            printf("   生产日期(例20070201):");
            scanf_s("%d", &p->data.year);
            printf("   t保质期(年):");
            scanf_s("%d", &p->data.no);
            //gets(x); //清除多余的输入 
            p->next = l->next;
            l->next = p;
            printf("   继续输入?(Y/N)");
            scanf_s("%c", &sign,1); //输入判断
            i++;
        }
        printf("          商品信息输入成功!\n");
        printf("\t\t\t");
        system("pause");
        return(n + i);
    }
    void sorttime(goodslist*& l)  //采用直接插入法对单链表l按进货时间递增有序排序
    {
        goodslist* p, *pre, *q;
        p = l->next->next;
        if (p != NULL)
        {
            l->next->next = NULL;
            while (p != NULL)
            {
                q = p->next;
                pre = l;
                while (pre->next != NULL && pre->next->data.time < p->data.time)
                {
                    pre = pre->next;
                }
                while (pre->next != NULL && pre->next->data.time == p->data.time &&
                    (pre->next->data.year + (pre->next->data.no) * 10000) < (p->data.year + (p->data.no) * 10000))
                {
                    pre = pre->next;
                }
                p->next = pre->next;
                pre->next = p;
                p = q;
            }
        }
        printf("  提示:按进货时间递增排序完毕\n");
        printf("\t\t\t");
        system("pause");
    }
    /*int locategoods(goodslist *l,char a[])  //按商品名称查询返回商品位置
    {
    int i=1;
    goodslist *p=l->next;
    printf("   请输入商品名称:");
    scanf("%s",a);
    while(p!=NULL&&strcmp(p->data.name,a)!=0)
    {
    p=p->next;
    i++;
    }
    if(p==NULL)
    return (0);
    else
    return(i);
    }*/
    
    void onlydisplay(goodslist* l, char a[])  //根据商品名称显示商品所有信息
    {
        int i = 1;
        goodslist* p = l->next;
        printf("   请输入商品名称:");
        scanf_s("%s", a,10);
        while (p != NULL && strcmp(p->data.name, a) != 0)
        {
            p = p->next;
            i++;
        }
        if (p == NULL)
            printf("不存在该商品!\n ");
        else
        {
            printf("      名称    进货时间    生产日期    保质期\n");
            printf("   --------------------------------------------------\n");
            printf("  >> %s      %d      %d     %d\n", p->data.name, p->data.time, p->data.year, p->data.no);
            printf("   --------------------------------------------------\n");
        }
        printf("\t\t\t");
        system("pause");
    }
    void deletegoods(goodslist* l, char a[])  //根据商品名称删除商品所有信息
    {
        int i = 1;
        int j = 0;
        goodslist* q = l, *s;
        goodslist* p = l->next;
        printf("   请输入要删除的商品名称:");
        scanf_s("%s", a,10);
        while (p != NULL && strcmp(p->data.name, a) != 0)
        {
            p = p->next;
            i++;
        }
        if (p == NULL)
            printf("不存在该商品!\n");
        else
        {
            while (j < i - 1 && q != NULL)
            {
                j++;
                q = q->next;
            }
            if (q == NULL)
                printf("不存在该商品!\n");
            else
            {
                s = q->next;
                if (s == NULL)
                    printf("不存在该商品!\n");
                q->next = s->next;
                free(s);
                printf("商品删除成功!\n");
            }
            printf("\t\t\t");
            system("pause");
        }
        /*if(p==NULL)
        printf("不存在该商品!\n ");
        else
        {
        printf("      名称    进货时间    生产日期    保质期\n");
        printf("   --------------------------------------------------\n");
        printf("  >> %s      %d      %d     %d\n",p->data.name,p->data.time,p->data.year,p->data.no);
        printf("   --------------------------------------------------\n");
        }*/
    }
    void display(goodslist* l)   //输出所有商品信息
    {
        goodslist* p = l->next;
        if (p == NULL)
            printf("  提示:没有任何商品信息记录\n");
        else
        {
            printf("      名称    进货时间    生产日期    保质期\n");
            printf("   --------------------------------------------------\n");
            while (p != NULL)
            {
                printf("  >> %s      %d      %d     %d\n", p->data.name, p->data.time, p->data.year, p->data.no);
                p = p->next;
            }
            printf("   --------------------------------------------------\n");
        }
        printf("\t\t\t");
        system("pause");
    }
    void main()
    {
        goodslist* l;
        char a[10];
        printf("由goods.dat文件建立商品信息单链表l\n");
        readfile(l);
        int n = 0;
        for (;;)
        {
            switch (menu_select()) //选择判断
            {
            case 1:
                printf("输入最初商品\n"); //输入若干条记录 
                n = inputall(l, n);
                break;
            case 2:
                display(l);
                break;
            case 3:inputgoods(l);
                break;
            case 4:deletegoods(l, a);
                break;
            case 5:onlydisplay(l, a);
                break;
            case 6:    sorttime(l);
                break;
            case 7:    savefile(l);
                break;
            case 8:delall(l);
                break;
            case 0:
                printf("\t\t\t结束退出!\n");   //结束程序
                printf("\t\t\t");
                system("pause");
                exit(1);
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 已采纳回答 12月15日
  • 创建了问题 10月9日

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行