C程序陷入困境,无法运行';我甚至都进不去
我为FCFS调度编写了以下代码。 问题是此代码编译正常,但在执行C程序陷入困境,无法运行';我甚至都进不去,c,gcc,runtime-error,C,Gcc,Runtime Error,我为FCFS调度编写了以下代码。 问题是此代码编译正常,但在执行/a.out后,什么也不显示,程序被卡住。它甚至不打印main()开头的Reading“printf语句。有什么问题 #include <stdio.h> struct process { int at; int bt; int wt; int tt; int rt; char pid[5]; } p[5]; int i, j; int n = 0; void main() { pr
/a.out
后,什么也不显示,程序被卡住。它甚至不打印main()
开头的Reading“
printf
语句。有什么问题
#include <stdio.h>
struct process
{
int at;
int bt;
int wt;
int tt;
int rt;
char pid[5];
} p[5];
int i, j;
int n = 0;
void main()
{
printf("Reading");
FILE *fp;
fp = fopen("in1.txt", "r");
char sample;
if (fp != NULL )
{
sample = getc(fp);
while (sample != EOF);
{
if (sample == '\n')
n++;
sample = getc(fp);
}
fseek(fp, 0, 0);
for (i = 0; i < n; i++)
{
fscanf(fp, "%s %d %d", p[i].pid, &p[i].at, &p[i].bt);
p[i].wt = p[i].tt = 0;
p[i].rt = p[i].bt;
}
fclose(fp);
}
//sorta();
printf("\nGantt Chart for FCFS\n");
int t = 0;
int avgw = 0;
int avgt = 0;
printf("%d ", t);
for (i = 0; i < n; i++)
{
if (p[i].at > t)
{
printf("%d ", t);
t = p[i].at;
}
p[i].wt = t - p[i].at;
avgw = avgw + p[i].wt;
printf("%s ", p[i].pid);
p[i].tt = p[i].bt + p[i].wt;
avgt = avgt + p[i].tt;
t = t + p[i].bt;
printf("%d ", t);
printf("\navg waiting time = %d", avgw / n);
printf("\navg turn around time = %d", avgt / n);
}
}
#包括
结构过程
{
int at;
国际电信;
int-wt;
int-tt;
int-rt;
char-pid[5];
}p[5];
int i,j;
int n=0;
void main()
{
printf(“阅读”);
文件*fp;
fp=fopen(“in1.txt”,“r”);
煤焦样品;
如果(fp!=NULL)
{
样本=getc(fp);
while(样本!=EOF);
{
如果(示例=='\n')
n++;
样本=getc(fp);
}
fseek(fp,0,0);
对于(i=0;it)
{
printf(“%d”,t);
t=p[i].at;
}
p[i].wt=t-p[i].at;
avgw=avgw+p[i].wt;
printf(“%s”,p[i].pid);
p[i].tt=p[i].bt+p[i].wt;
avgt=avgt+p[i].tt;
t=t+p[i].bt;
printf(“%d”,t);
printf(“\navg等待时间=%d”,avgw/n);
printf(“\navg周转时间=%d”,avgt/n);
}
}
标准输出是行缓冲的。将“Reading”更改为“Reading\n”,您将看到它
那么您在这里有一个错误:
while (sample!=EOF);
while循环的主体只是分号,而不是后面的块!如果条件为真,程序将陷入无限循环。标准输出是行缓冲的。将“Reading”更改为“Reading\n”,您将看到它 那么您在这里有一个错误:
while (sample!=EOF);
while循环的主体只是分号,而不是后面的块!如果条件为真,您的程序将陷入无限循环。请在顶部,即
void main
int t =0;
int avgw=0;
int avgt=0;
并删除代码>之后
while (sample!=EOF)
务必在顶部,即void main
int t =0;
int avgw=0;
int avgt=0;
并删除代码>之后
while (sample!=EOF)
知道了。但是为什么在那之后就不执行呢?谢谢!现在才找到!另外,getc
返回一个int,而不是char。所以while循环永远不会与EOF进行比较,因为EOF通常被定义为一个大于255的整数常量。@Lundin:que?EOF保证为负值(ISO/IEC 9899:2011§7.21.1:“EOF
[…]扩展为整数常量表达式,类型为int
和负值”)。关于getc()
返回一个int
,您是对的,但是循环终止取决于纯char
是有符号的还是无符号的。如果有符号,则字符代码0xFF(ÿ)将提前触发EOF;如果它是无符号的,那么就有一个无限循环,因为没有一个无符号字符值等于-1。明白了。但是为什么在那之后就不执行呢?谢谢!现在才找到!另外,getc
返回一个int,而不是char。所以while循环永远不会与EOF进行比较,因为EOF通常被定义为一个大于255的整数常量。@Lundin:que?EOF保证为负值(ISO/IEC 9899:2011§7.21.1:“EOF
[…]扩展为整数常量表达式,类型为int
和负值”)。关于getc()
返回一个int
,您是对的,但是循环终止取决于纯char
是有符号的还是无符号的。如果有符号,则字符代码0xFF(ÿ)将提前触发EOF;如果它是无符号的,则有一个无限循环,因为没有任何无符号字符值等于-1。它正在打印:读取FCFS 0的甘特图。您使用的编译器是什么?小注释:p[5]
,然后让i
从0
运行到n-1
,这可能超过4
,将导致缓冲区溢出,任何有足够行的文件都会导致缓冲区溢出。请在发布之前缩进您的代码。它正在打印:读取FCFS 0的甘特图。您使用的编译器是什么?简短的评论:p[5]
,然后让i
从0
运行到n-1
,这可能超过4
,将导致缓冲区溢出,任何具有足够行数的文件。请在发布前缩进代码。只有在使用反向编译器(不支持C99或更高版本)时才需要移动声明。只有在使用反向编译器(不支持C99或更高版本)时才需要移动声明。