求大佬帮解决这个c语言问题,为什么这个程序一运行到scanf就会崩溃

编程界菜须鲲 2019-05-08 10:20:34
#include<stdio.h> #define max 100 #define pfree 0 /*进程结束*/ #define running 1 /*运行状态*/ #define aready 2 /*就绪状态*/ #define blocking 3 /*阻塞状态*/ typedef struct node { char name; //进程名 int status; //状态 int Arrive_Time; //到达时间 int Serve_Time; //服务时间 int Finish_Time; //完成时间 int priority; //优先级 struct node *next; /*pcb define*/ }PCB; PCB array[max]; PCB *createprocess(PCB *head) { //输入进程创建就绪队列 int num,i; printf("请输入进程的数量:\n"); scanf("%d",&num); if(num>100){ printf("进程数超出,系统崩溃!\n"); } //head指向第一个进程 head=array; for( i=0;i<num;i++){ array[i].next=&array[i+1]; array[i].status=aready; array[i].Finish_Time=0; array[i].priority=0; } for(i=0;i<num;i++){//进程初始化 scanf("%s %d %d",&array[i].name,&array[i].Arrive_Time,&array[i].Serve_Time);//为什么这里就出问题了啊啊啊啊啊啊 printf("%s %d %d\n",array[i].name,array[i].Arrive_Time,array[i].Serve_Time); } array[num-1].next=NULL; return head; } void processfifo(PCB *head) /*use fifo */ { //①按照fifo算法对就绪队列进程实施调度(基本要求) //②并计算各进程的周转时间(选做) PCB *p; p=head; int time=0;//表示系统时间 for(;p!=NULL;p=p->next){//计算各个进程的完成时间 p->Finish_Time=p->Serve_Time+time; time=p->Finish_Time ; } printf("进程 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间"); p=head; for(;p!=NULL;p=p->next){ printf("%2c %4d %4d %4d %4d %4d %6.2f",p->name,p->Arrive_Time,p->Serve_Time,p->Finish_Time-p->Serve_Time,p->Finish_Time,p->Finish_Time-p->Arrive_Time,(p->Finish_Time-p->Arrive_Time)/p->Serve_Time); } } main() { PCB *head; head=NULL; head=createprocess(head); processfifo(head); }
...全文
199 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mobeixiaoran 2019-09-19
  • 打赏
  • 举报
回复
如果在VS中 csanf换成 casnf_s
636f6c696e 2019-05-09
  • 打赏
  • 举报
回复
name的类型改成char数组就好了
赵4老师 2019-05-09
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
自信男孩 2019-05-09
  • 打赏
  • 举报
回复
printf("%s %d %d\n",array[i].name,array[i].Arrive_Time,array[i].Serve_Time);

name是char类型,这里用%s,那么很可能会出现程序崩溃,出现段错误(因为可能越界)。
自信男孩 2019-05-09
  • 打赏
  • 举报
回复
&array[i].name,这个用%s,但是你的name是char类型哦。是不是应该用%c,或者把name定义成数组,然后再去掉&呢
wshyhm 2019-05-09
  • 打赏
  • 举报
回复
单步调试是个很重要的技能! 我测试了下,错误不是在scanf("%s %d %d",&array[i].name,&array[i].Arrive_Time,&array[i].Serve_Time); 而是在它下一行的:printf("%s %d %d\n",array[i].name,array[i].Arrive_Time,array[i].Serve_Time); 具体的原因是:PCB.name 是个 char 类型,你输出时用了%s,应该是%c。 但是我的理解,应该是你的name类型用错了,你的本意应该是想用字符串。那可以定义为 char name[20]; // 长度根据你的需要调整 这样name就是一个字符串,而不是单个字符。如果name用字符串数组的话,就可以用%s输出。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧