c语言 指针交换两个字符串

其实这个题是要用结构把学生成绩输进去再根据程序排序再输出学生信息,我不知道怎么根据成绩大小把st[].name输出啊,我用了一个交换函数,change想交换st[j].name和st[j-1].name但是都不行,因为st[j].name是个常量?怎么交换?

#include<stdio.h>
#define N 3
struct student
{
int number;
char name[20];
int result[3];
}st[3]={{1,"zhang"},{2,"li"},{3,"wang"}};

void getscore() //输成绩的函数
{
int i;
for(i=0; i<N; i++)
{
printf("请分别输入第%d个学生的数学,语文,英语成绩\n",i+1);
scanf("%d", &st[i].result[0]);
scanf("%d", &st[i].result[1]);
scanf("%d", &st[i].result[2]);
}
}
void change(char *str1,char *str2)
{
char *temp;
temp=str1;
str1=str2;
str2=temp;
}

void order(int index)
{
int i,j,temp1,temp2;
char *title[]={"数学","语文","英语"};
for(i=0; i<N-1; i++)
for(j=N-1;j>i;j--)
if(st[j].result[index]>st[j-1].result[index])
{
temp1=st[j].result[index];
st[j].result[index]=st[j-1].result[index];
st[j-1].result[index]=temp1;
temp2=st[j].number;
st[j].number=st[j-1].number;
st[j-1].number=temp2;
change(st[j].name,st[j-1].name);
}
for(i=0;i<3;i++)
printf("%s%d\n",st[i].name,st[i].number);
}
void main()
{
getscore();
printf("数学成绩从大到小学生姓名和学号依次是\n");
order(0);
printf("语文成绩从大到小学生姓名和学号依次是\n");
order(1);
printf("英语成绩从大到小学生姓名和学号依次是\n");
order(2);
}
嗯,这个对了,还有个问题,数学和英语成绩交换对了,但是第二个语文成绩是不随分数大小交换的,我明明按冒泡法遍历过数组了呀。。。为什么?

如果只是交换的问题的话,还是不难的。
其实你是因为指针的定义没有弄清楚。
void change(char *str1,char *str2)
{ char *temp;
temp=str1;
str1=str2;
str2=temp;
}
这个函数你输入的是两个地址(指针变量),并不是两个int型的变量(*str).比如说将两个地址比喻成两个包,你的程序只将两个包的地址改变了并没有改变包中的东西,如果要将这两个交换,就必须把两个包中的东西交换。
正确程序如下:
void change(char *str1,char *str2)
{ char temp;
temp=*str1;
*str1=*str2;
*str2=temp;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-13
字符串用strcpy()函数进行交换 加头文件string.h 而不能直接赋值,修改程序如下:

#include<stdio.h>
#include<string.h>
#define N 3
struct student
{
int number;
char name[20];
int result[3];
}st[3]={{1,"zhang"},{2,"li"},{3,"wang"}};

void getscore() //输成绩的函数
{
int i;
for(i=0; i<N; i++)
{
printf("请分别输入第%d个学生的数学,语文,英语成绩\n",i+1);
scanf("%d", &st[i].result[0]);
scanf("%d", &st[i].result[1]);
scanf("%d", &st[i].result[2]);
}
}
void change(char *str1,char *str2)
{
char temp[10];
strcpy(temp,str1);
strcpy(str1,str2);
strcpy(str2,temp);

}

void order(int index)
{
int i,j,temp1,temp2;
char *title[]={"数学","语文","英语"};
for(i=0; i<N-1; i++)
for(j=N-1;j>i;j--)
if(st[j].result[index]>st[j-1].result[index])
{
temp1=st[j].result[index];
st[j].result[index]=st[j-1].result[index];
st[j-1].result[index]=temp1;
temp2=st[j].number;
st[j].number=st[j-1].number;
st[j-1].number=temp2;
change(st[j].name,st[j-1].name);
}
for(i=0;i<3;i++)
printf("%s%d\n",st[i].name,st[i].number);
}
void main()
{
getscore();
printf("数学成绩从大到小学生姓名和学号依次是\n");
order(0);
printf("语文成绩从大到小学生姓名和学号依次是\n");
order(1);
printf("英语成绩从大到小学生姓名和学号依次是\n");
order(2);
}
第2个回答  2015-10-16
长度不同,两者存放单元的个数应当都大于 最长的字符串,否则交换以后 存不下,会出错。
#include <stdio.h>
#include <stdlib.h>
void jh(char *p1, char *p2){
char *t;
int i,L;
L = strlen(p1);
if (strlen(p2) > L) L = strlen(p2);
t = (char *) malloc(sizeof(char) * L);
strcpy(t,p1);strcpy(p1,p2);strcpy(p2,t); // 交换
}
main(){
char s1[100]="abc", s2[100]="1234567"; // 实际允许存放量必需足够大
printf("%s %s \n",s1,s2);
jh(s1,s2);
printf("%s %s \n",s1,s2);
return 0;
}本回答被网友采纳
相似回答