在C中有代码问题

时间:2015-01-18 07:03:22

标签: c arrays class structure

有人可以告诉我这段代码有什么问题吗?

编译此代码时没有问题,但在编译后输入结构对象数组的数据时,数据不会在一个循环后输入。

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

2 个答案:

答案 0 :(得分:3)

阅读scanf(3)fflush(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()的返回,这总是一个好习惯。