关于结构体交换

时间:2021-08-29 10:43:41

//以年龄顺序输出信息
#include <stdio.h>
#include <string.h>
void swit_stu(struct student *a,struct student *b);
struct student{
int stunum;
char name[6];
int age;
};
int main(void)
{
int n,i,j=0,mi;
char m;
struct student st[20];
scanf("%d",&n);
printf("There are %d student(s).\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",&st[i].name);
scanf("%d",&st[i].age);
}

for(i=0;i<n;i++)

for(i=0;i<n-1;i++)
for(j=0;j<n;j++)
{
if(st[j].age>st[j+1].age)
{
swit_stu(&st[j],&st[j+1]);
}
}

for(i=0;i<n;i++)
printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);
return 0;
}
void swit_stu(struct student *a,struct student *b)
{
struct student temp;
temp=*a;
*a=*b;
*b=temp;
}

为神马我换完以后第二行(也就是年龄最大的一组)会变成乱码T^T...想了半天了不知道肿么回事 关于结构体交换

18 个解决方案

#1


进行内存拷贝(深拷贝)

#2


首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
void swit_stu(struct student *a,struct student *b)
{
    struct student *temp;
    temp=a;
    a=b;
    b=temp;
}

#3


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……

最大问题估计是越界了,要么就是指针飞了…………改掉那个以后就好了。
你那个我试过了,没有效果 关于结构体交换

#4


我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
修改后的代码如下:
#include <stdio.h>
#include <string.h>

struct student{
    int stunum;
char name[6];
int age;
};

void swit_stu(struct student *a,struct student *b);

int main(void)
{
int n,i,j=0,mi;
char m;
struct student *temp;
struct student st[20];
scanf("%d",&n);
printf("There are %d student(s).\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",&st[i].name);
scanf("%d",&st[i].age);
    }    
for(i=0;i<n;i++)
for(j=0;j< (n - 1);j++)
{
                       
if(st[j].age>st[j+1].age)
{
     swit_stu(&st[j],&st[j+1]);

}     
            }
            
for(i=0;i<n;i++)
               printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);
return 0;
}
void swit_stu(struct student *a,struct student *b)
{
        //printf("before add:%p, %p\n", a, b);
    int num, age;
    char *name = NULL;
    num = a->stunum;
    age = a->age;
    name = a->name;
    
    a->stunum = b->stunum;
    a->age = b->age;
    memcpy(a->name, b->name, 6);  //不能用a->name = b->name;数组地址为常量,不可作为左值 
    
    s
    b->stunum = num;
    b->age = age;
    memcpy(b->name, name, 6);     
    //printf("before add:%p, %p\n", a, b);
}

#5


不好意思,刚刚贴错了。。这是正确的。。
#include <stdio.h>
#include <string.h>

struct student{
    int stunum;
char name[6];
int age;
};

void swit_stu(struct student *a,struct student *b);

int main(void)
{
int n,i,j=0,mi;
char m;
struct student *temp;
struct student st[20];
scanf("%d",&n);
printf("There are %d student(s).\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",&st[i].name);
scanf("%d",&st[i].age);
    }    
for(i=0;i<n;i++)
for(j=0;j< (n - 1);j++)
{
                       
if(st[j].age>st[j+1].age)
{
     swit_stu(&st[j],&st[j+1]);

}     
            }
            
for(i=0;i<n;i++)
               printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);
return 0;
}
void swit_stu(struct student *a,struct student *b)
{
        //printf("before add:%p, %p\n", a, b);
    int num, age;
    char name[6];
    num = a->stunum;
    age = a->age;
    memcpy(name,a->name, 6);
    
    a->stunum = b->stunum;
    a->age = b->age;
    memcpy(a->name, b->name, 6);  //不能用a->name = b->name;数组地址为常量,不可作为左值 

    b->stunum = num;
    b->age = age;
    memcpy(b->name, name, 6);     
    //printf("before add:%p, %p\n", a, b);
}

#6


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……
你这样交换才是错的,lz的交换方法是正确的

#7


引用 4 楼 Gonefar 的回复:
我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
……
lz的结构体是POD类型,完全可以直接交换,不需要内存拷贝

#8


引用 楼主 sl940316 的回复:
Perl code?123456789101112131415161718192021222324252627282930313233343536373839404142434445//以年龄顺序输出信息#include <stdio.h>#include <string.h>void swit_stu(struct student *a,struct student *……
就是排序方法有点问题,还有是貌似多出一个for循环。

//以年龄顺序输出信息
#include <stdio.h>
#include <string.h>

struct student;
void swit_stu(struct student *a,struct student *b);
struct student{
int stunum;
char name[6];
int age;
};

int main(void)
{
int n,i,j=0/*, mi*/;
//char m;
struct student st[20];

scanf("%d",&n);
printf("There are %d student(s).\n",n);

for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",st[i].name);
scanf("%d",&st[i].age);
}

       //for(i=0;i<n;i++)

for(i=0; i< n; i++)
for(j = 0; j < n - 1 - i; j++)
{
if(st[j].age > st[j+1].age)
{
swit_stu(&st[j], &st[j+1]);
}
}

for(i=0; i<n; i++)
printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);

return 0;
}

void swit_stu(struct student *a,struct student *b)
{
struct student temp;
temp =*a;
*a = *b;
*b = temp;
}

#9


lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

#10


引用 6 楼 rocktyt2 的回复:
引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    ……

lz那样的交换可以?我测试了一下,*a是第一个成员的值!!不知道你是怎么想的。。

#11


引用 10 楼 Gonefar 的回复:
引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,str……
a是student类型的指针,解引用后是一个student结构
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗

#12


引用 11 楼 rocktyt2 的回复:
引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(s……

lz的交换方式不是不是这样吗
void swit_stu(struct student *a,struct student *b)
{
    struct student temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

这样交换的话,自然是把第一个成员stunum交换了啊,其它没变。

#13


而且那样的交换方式达不到目的。你运行过那样的方式可以达到交换的目的?

#14


引用 12 楼 Gonefar 的回复:
引用 11 楼 rocktyt2 的回复:引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1……
指针指向的是整个student结构体,为什么单单是stunum被交换了?我实在无法理解你的逻辑,能否解释一下?
是的,我承认我没有运行过,因为这个问题实在太基础了根本不需要运行就知道是否正确
指针方式交换数据时多么基础的东西啊

#15


void swit_stu(struct student *a,struct student *b)
{
 struct student t;
 t=*a;*a=*b;*b=t;
}

#16


swit_stu函数没有问题的,出错的原因可能是9楼所说情况

引用 9 楼 rocktyt2 的回复:
lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

#17


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……

貌似确实是越界的问题……我把那个改了就可以了T^T。。。

引用 16 楼 mymtom 的回复:
swit_stu函数没有问题的,出错的原因可能是9楼所说情况

引用 9 楼 rocktyt2 的回复:lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

题目告诉名字只存6个了^_^谢谢啊.而且我也知道名字超6个以后该怎么办^^

#18


引用 14 楼 rocktyt2 的回复:
引用 12 楼 Gonefar 的回复:引用 11 楼 rocktyt2 的回复:引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以……

那个交换是可以达到目的,学艺不精,让你笑话了。。以前没接触到过结构体交换,找些相关的东西看看。
顺便说一下8L的代码是可以正确运行的。

#1


进行内存拷贝(深拷贝)

#2


首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
void swit_stu(struct student *a,struct student *b)
{
    struct student *temp;
    temp=a;
    a=b;
    b=temp;
}

#3


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……

最大问题估计是越界了,要么就是指针飞了…………改掉那个以后就好了。
你那个我试过了,没有效果 关于结构体交换

#4


我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
修改后的代码如下:
#include <stdio.h>
#include <string.h>

struct student{
    int stunum;
char name[6];
int age;
};

void swit_stu(struct student *a,struct student *b);

int main(void)
{
int n,i,j=0,mi;
char m;
struct student *temp;
struct student st[20];
scanf("%d",&n);
printf("There are %d student(s).\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",&st[i].name);
scanf("%d",&st[i].age);
    }    
for(i=0;i<n;i++)
for(j=0;j< (n - 1);j++)
{
                       
if(st[j].age>st[j+1].age)
{
     swit_stu(&st[j],&st[j+1]);

}     
            }
            
for(i=0;i<n;i++)
               printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);
return 0;
}
void swit_stu(struct student *a,struct student *b)
{
        //printf("before add:%p, %p\n", a, b);
    int num, age;
    char *name = NULL;
    num = a->stunum;
    age = a->age;
    name = a->name;
    
    a->stunum = b->stunum;
    a->age = b->age;
    memcpy(a->name, b->name, 6);  //不能用a->name = b->name;数组地址为常量,不可作为左值 
    
    s
    b->stunum = num;
    b->age = age;
    memcpy(b->name, name, 6);     
    //printf("before add:%p, %p\n", a, b);
}

#5


不好意思,刚刚贴错了。。这是正确的。。
#include <stdio.h>
#include <string.h>

struct student{
    int stunum;
char name[6];
int age;
};

void swit_stu(struct student *a,struct student *b);

int main(void)
{
int n,i,j=0,mi;
char m;
struct student *temp;
struct student st[20];
scanf("%d",&n);
printf("There are %d student(s).\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",&st[i].name);
scanf("%d",&st[i].age);
    }    
for(i=0;i<n;i++)
for(j=0;j< (n - 1);j++)
{
                       
if(st[j].age>st[j+1].age)
{
     swit_stu(&st[j],&st[j+1]);

}     
            }
            
for(i=0;i<n;i++)
               printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);
return 0;
}
void swit_stu(struct student *a,struct student *b)
{
        //printf("before add:%p, %p\n", a, b);
    int num, age;
    char name[6];
    num = a->stunum;
    age = a->age;
    memcpy(name,a->name, 6);
    
    a->stunum = b->stunum;
    a->age = b->age;
    memcpy(a->name, b->name, 6);  //不能用a->name = b->name;数组地址为常量,不可作为左值 

    b->stunum = num;
    b->age = age;
    memcpy(b->name, name, 6);     
    //printf("before add:%p, %p\n", a, b);
}

#6


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……
你这样交换才是错的,lz的交换方法是正确的

#7


引用 4 楼 Gonefar 的回复:
我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
……
lz的结构体是POD类型,完全可以直接交换,不需要内存拷贝

#8


引用 楼主 sl940316 的回复:
Perl code?123456789101112131415161718192021222324252627282930313233343536373839404142434445//以年龄顺序输出信息#include <stdio.h>#include <string.h>void swit_stu(struct student *a,struct student *……
就是排序方法有点问题,还有是貌似多出一个for循环。

//以年龄顺序输出信息
#include <stdio.h>
#include <string.h>

struct student;
void swit_stu(struct student *a,struct student *b);
struct student{
int stunum;
char name[6];
int age;
};

int main(void)
{
int n,i,j=0/*, mi*/;
//char m;
struct student st[20];

scanf("%d",&n);
printf("There are %d student(s).\n",n);

for(i=0;i<n;i++)
{
scanf("%d",&st[i].stunum);
scanf("%s",st[i].name);
scanf("%d",&st[i].age);
}

       //for(i=0;i<n;i++)

for(i=0; i< n; i++)
for(j = 0; j < n - 1 - i; j++)
{
if(st[j].age > st[j+1].age)
{
swit_stu(&st[j], &st[j+1]);
}
}

for(i=0; i<n; i++)
printf("The student name is %s,his NO. is %d,he is %d years old.\n",st[i].name,st[i].stunum,st[i].age);

return 0;
}

void swit_stu(struct student *a,struct student *b)
{
struct student temp;
temp =*a;
*a = *b;
*b = temp;
}

#9


lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

#10


引用 6 楼 rocktyt2 的回复:
引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    ……

lz那样的交换可以?我测试了一下,*a是第一个成员的值!!不知道你是怎么想的。。

#11


引用 10 楼 Gonefar 的回复:
引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,str……
a是student类型的指针,解引用后是一个student结构
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗

#12


引用 11 楼 rocktyt2 的回复:
引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(s……

lz的交换方式不是不是这样吗
void swit_stu(struct student *a,struct student *b)
{
    struct student temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

这样交换的话,自然是把第一个成员stunum交换了啊,其它没变。

#13


而且那样的交换方式达不到目的。你运行过那样的方式可以达到交换的目的?

#14


引用 12 楼 Gonefar 的回复:
引用 11 楼 rocktyt2 的回复:引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1……
指针指向的是整个student结构体,为什么单单是stunum被交换了?我实在无法理解你的逻辑,能否解释一下?
是的,我承认我没有运行过,因为这个问题实在太基础了根本不需要运行就知道是否正确
指针方式交换数据时多么基础的东西啊

#15


void swit_stu(struct student *a,struct student *b)
{
 struct student t;
 t=*a;*a=*b;*b=t;
}

#16


swit_stu函数没有问题的,出错的原因可能是9楼所说情况

引用 9 楼 rocktyt2 的回复:
lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

#17


引用 2 楼 Gonefar 的回复:
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
C/C++ code?1234567void swit_stu(struct student *a,struct student *b){    struct student *tem……

貌似确实是越界的问题……我把那个改了就可以了T^T。。。

引用 16 楼 mymtom 的回复:
swit_stu函数没有问题的,出错的原因可能是9楼所说情况

引用 9 楼 rocktyt2 的回复:lz看一下你的name长度,你只定义了char[6],够用吗?6个字符就越界了,然后就会乱码

题目告诉名字只存6个了^_^谢谢啊.而且我也知道名字超6个以后该怎么办^^

#18


引用 14 楼 rocktyt2 的回复:
引用 12 楼 Gonefar 的回复:引用 11 楼 rocktyt2 的回复:引用 10 楼 Gonefar 的回复:引用 6 楼 rocktyt2 的回复:引用 2 楼 Gonefar 的回复:首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以……

那个交换是可以达到目的,学艺不精,让你笑话了。。以前没接触到过结构体交换,找些相关的东西看看。
顺便说一下8L的代码是可以正确运行的。