本人写了个程序,尝试着用了下goto语句,碰到个问题
程序如下:
#define MAX 50 #include"head.h" #include<stdio.h> #include<stdlib.h>
void Stated() { int i,j,m,n,sum,t=0,t1,t2,k=65; char c; Dispe Area[MAX],temp[MAX],proceed[MAX]; printf("系统分区个数m:\n"); scanf("%d",&m); printf("初始数据:\n"); for(i=1;i<=m;i++) { printf("Area[%d]--size:",i); scanf("%d",&Area[i].size); printf("\n"); } printf("第一个分区的始址addr:"); scanf("%d",&Area[1].initaddr); for(i=2;i<=m;i++) Area[i].initaddr=Area[i-1].size+Area[i-1].initaddr; for(i=1;i<=m;i++) Area[i].mode='F'; printf("分区情况:\n"); printf("分区号 大小(KB) 始址(K) 状态\n"); for(i=1;i<=m;i++) printf("%d %d %d %c\n",i,Area[i].size,Area[i].initaddr,Area[i].mode); printf("(其中'T'表示已分配,'F'表示未分配)\n"); sum=1; loop: if(sum<=100) { printf("作业个数n:"); scanf("%d",&n); printf("\n作业大小:\n"); for(i=1;i<=n;i++) { printf("作业%c:",k++); scanf("%d",&proceed[i].size); printf("\n"); } k=65; for(i=1;i<=m;i++) { temp[i].size=Area[i].size; temp[i].index=i; } for(i=1;i<m;i++) for(j=1;j<=m-i;j++) if(temp[j].size>temp[j+1].size) { t1=temp[j].size; t2=temp[j].index; temp[j].size=temp[j+1].size; temp[j].index=temp[j+1].index; temp[j+1].size=t1; temp[j+1].index=t2; } printf("对分区大小进行排序:\n"); for(i=1;i<=m;i++) printf("%d (%d) ",temp[i].size,temp[i].index); printf("\n"); for(i=1;i<=n;i++) { j=1; while(j<=m) { if(proceed[i].size>temp[j].size) j++; else { if(Area[temp[j].index].mode=='F') { Area[temp[j].index].mode='T'; proceed[i].index=temp[j].index; j=m+1; } else j++; } } } printf("作业调度后内存分配情况:\n"); printf("分区号 大小(KB) 始址(K) 状态\n"); for(i=1;i<=m;i++) printf("%d %d %d %c\n",i,Area[i].size,Area[i].initaddr,Area[i].mode); printf("其中:\n"); k=65+t; t=n; for(i=1;i<=n;i++) printf("作业%c被分配在第%d个分区中;\n",k++,proceed[i].index); for(i=1;i<=m;i++) if(Area[i].mode=='T') Area[i].mode='F'; printf("还有其他作业吗?(有:121,无:除121以外的任何数字)\n"); scanf("%c",&c);//这样写程序根本就不让我输如字符,但要是改做scanf("%d",&c);就可以输入,这是怎么回事呢? if(c=='y') { sum++; goto loop; } else { sum=101; goto loop; } } }
----------------解决方案--------------------------------------------------------
这个问题很好解决的!发生这种情况是因为scanf取数值是使用缓冲的!在你的那个语句前面添加fflush(stdin)就可以了!!
----------------解决方案--------------------------------------------------------
那是不是当要连续输入的数据的类型不同时,才会有这种情况发生呢?
----------------解决方案--------------------------------------------------------
这个好像不是的,有时候会发生这种情况的!一般当你输入的是%c的时候就会发生,这个要时刻考虑到键盘缓冲区内是不是还有字符存在,一般容易忽视的是\n字符。如果键盘缓冲区中存在一个字符那么当使用%c输入的时候,那么由于存在一个字符可供程序读取那么程序就不会需要你的输入了,所以发生了不要求你输入的情况!!
----------------解决方案--------------------------------------------------------
哦
通了!!!
也就是程序里有的地方要用getchar()一样!这里用这个也可以解决!
谢了!
----------------解决方案--------------------------------------------------------