#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);
}
}
}

C语言 管理系统 当我输入图书的名称之后 就无法继续下面的程序了 调试之后的结果如图 该怎么办呀?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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); } } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报