c语言结构体排序哪里出问题了

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
char name[10];
char num[10];
int score[3];
float aver;
}stud[5];
//结构体内排序
void sort(struct student *stud_p,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(stud_p[k].aver<stud_p[j].aver) k=j;
if(k!=i)
//这里的问题了*****************************
{
char name_temp[10]={0};
char num_temp[10]={0};
int score_temp;
float aver_temp;
strcpy(name_temp,stud_p[i].name);
strcpy(stud_p[i].name,stud_p[k].name);
strcpy(stud_p[k].name,name_temp);
strcpy(num_temp,stud_p[i].num);
strcpy(stud_p[i].num,stud_p[k].num);
strcpy(stud_p[k].num,num_temp);
score_temp=stud_p[i].score[0];stud_p[i].score[0]=stud_p[k].score[0];stud_p[k].score[0]=score_temp;
score_temp=stud_p[i].score[1];stud_p[i].score[1]=stud_p[k].score[1];stud_p[k].score[1]=score_temp;
score_temp=stud_p[i].score[2];stud_p[i].score[2]=stud_p[k].score[2];stud_p[k].score[2]=score_temp;
aver_temp=stud_p[i].aver;stud_p[i].aver=stud_p[k].aver;stud_p[k].aver=aver_temp;
}
}
}
//主函数
void main()
{
FILE *fp1;
int i=0;
if((fp1=fopen("d:\\test\\1.txt","r"))==NULL)
{printf("Wrong!");exit(0);}
while(!feof(fp1))
{
fscanf(fp1,"%s%s%d%d%d%f\n",stud[i].name,stud[i].num,&stud[i].score[0],&stud[i].score[1],&stud[i].score[2],&stud[i].aver);
i++;
}
fclose(fp1);
sort(stud,5);//调用函数sort();
i=0;
for(i=0;i<5;i++)
printf("%s %s %d %d %d %f\n",stud[i].name,stud[i].num,stud[i].score[0],stud[i].score[1],stud[i].score[2],stud[i].aver);
}
上面的代码是正确的,但是问题是这样的,就是在************以下的结构体交换的代码,我想另外写的一个函数里,我是这样写的:
把****************一下换为
{swap(stud_p+i,stud_p+k);}
然后:
void swap(struct student *p1,struct student *p2)
{
char name_temp[10];
char num_temp[10];
int score_temp;
float aver_temp;
strcpy(name_temp,p2.name);
strcpy(p2.name,p1.name);
strcpy(p1.name,name_temp);
strcpy(num_temp,p2.num);
strcpy(p2.num,p1.num);
strcpy(p1.num,num_temp);
score_temp=p1.score[0];p1.score[0]=p2.score[0];p2.score[0]=score_temp;
score_temp=p1.score[1];p1.score[1]=p2.score[1];p2.score[1]=score_temp;
score_temp=p1.score[2];p1.score[2]=p2.score[2];p2.score[2]=score_temp;
aver_temp=p1.aver;p1.aver=p2.aver;p2.aver=aver_temp;
}
但是编译总是出错,我想是不是函数参数传递的问题呢,请帮我看看吧,谢谢了!

//---------------------------------------------------------
说真的代码有点儿乱,麻烦你贴出有问题的整个代码,你可能以为表述清楚了,但我没有看明白!
我也贴一个我写的结构代码:

写了一个粗糙的程序,VC测试通过
student.h
//---------------------
#ifndef STUDENT_H_
#define STUDENT_H_
#include <stdio.h>
#define MAX 20
#define SIZE 5

struct student
{
char name[MAX];
int age;
float chinese;
float math;
float average;
};

typedef struct student STD;

void get_data(STD *ps);
void print_info(STD *ps);
void get_avg(STD *ps);
void s_sort(STD *ps);

#endif
//-----------------------------
student.c
//----------------------
#include <stdio.h>
#include "student.h"

static float sum(STD *ps);

void get_data(STD *ps)
{
int i;
puts("-------------------------请输入学生信息");
puts("姓名 年龄 语文 数学"); //各成员空格间隔
for(i=0; i<SIZE; i++)
{
scanf("%s%d%f%f", (ps+i)->name, &((ps+i)->age), &((ps+i)->chinese), &((ps+i)->math));
get_avg(ps+i);
while (getchar() != '\n')
continue;
}
puts("");
return ;
}

void print_info(STD *ps)
{
int i;
puts("--------------------- 学生的成绩列表:");
puts("姓名 年龄 语文 数学 总分 平均分");
for (i=0; i<SIZE; i++)
{
printf("%s %d %.1f %.1f %.1f %.1f \n", (ps+i)->name, (ps+i)->age, (ps+i)->chinese,
(ps+i)->math, sum(ps+i), (ps+i)->average);
}
}

void get_avg(STD *ps)
{
ps->average = sum(ps) / 2;
}

void s_sort(STD *ps)
{
float temp;
STD pt;
int i;
int j;
for (i=0; i<SIZE; i++)
{
for (j=i+1; j<SIZE; j++)
{
if (sum(ps+i) < sum(ps+j))
{
pt = ps[j];
ps[j] = ps[i];
ps[i] = pt;
}
}
}
}
static float sum(STD *ps)
{
return ps->chinese + ps->math;
}
//--------------------------------
main.c
//--------------------------------
#include <stdio.h>
#include "student.h"

int main(void)
{
STD std[SIZE];
get_data(std);
s_sort(std);
print_info(std);
}

希望对你有帮助!
麻烦再修改一下问题,再帮你看看!
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-09-14
错误代码,然后swap名字改下先,改成swapnew等,应为swap要和库函数里的冲突的
相似回答