有人可以告诉我这段代码有什么问题吗?
编译此代码时没有问题,但在编译后输入结构对象数组的数据时,数据不会在一个循环后输入。
#include<stdio.h>
struct process{
char name;
int arv;
int burst;
}p[10];
int sort(struct process p[],int n){
int i,j;
struct process t;
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
if(p[j].arv>p[j+1].arv){
p[j]=t;
p[j]=p[j+1];
p[j+1]=t;
}
}
}
return 0;
}
int main(){
int i,n;
printf("Enter Number Of Processes");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%c",&p[i].name);
scanf("%d",&p[i].arv);
scanf("%d",&p[i].burst);
}
sort(p,n);
for(i=0;i<n;i++){
printf("%c",p[i].name);
printf("%d",p[i].arv);
printf("%d",p[i].burst);
}
return 0;
}
答案 0 :(得分:3)
始终测试scanf
printf("Enter Number Of Processes");
fflush(NULL);
if (scanf("%d",&n)<1)
{ perror("scanf nb process"); exit(EXIT_FAILURE); ; }
(对scanf
的其他电话也是如此......)
并且至少在每个fflush
循环结束时调用for
,例如
for(i=0;i<n;i++){
printf("%c",p[i].name);
printf("%d",p[i].arv);
printf("%d",p[i].burst);
fflush(NULL);
}
因为stdio(3) 已缓冲。顺便说一句,你会对输出感到惊讶。您通常应该使用printf
\n
格式字符串
顺便说一句,你应该编译所有的警告&amp;调试信息(gcc -Wall -Wextra -g
),你应该使用调试器(gdb
)
答案 1 :(得分:0)
我猜,你遇到scanf()
的问题。但请不要使用fflush()
因为上述某些答案建议在fflush(NULL)
之前使用scanf()
。输入流上的fflush()
stdin
具有未定义的行为,Read Here fflush()
而是在每次扫描之前使用以下内容清除stdin
。
while ((c = getchar()) != EOF && c != '\n')
;
它清除最后一次输入后按下的换行符,该换行符未被scanf()
还会检查scanf()
的返回,这总是一个好习惯。