//以年龄顺序输出信息
#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看一下,肯定不是结构体的全部内容。
你可以直接交换地址
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
void swit_stu(struct student *a,struct student *b)
{
struct student *temp;
temp=a;
a=b;
b=temp;
}
#3
最大问题估计是越界了,要么就是指针飞了…………改掉那个以后就好了。
你那个我试过了,没有效果
#4
我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
修改后的代码如下:
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
你这样交换才是错的,lz的交换方法是正确的
#7
lz的结构体是POD类型,完全可以直接交换,不需要内存拷贝
#8
就是排序方法有点问题,还有是貌似多出一个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
lz那样的交换可以?我测试了一下,*a是第一个成员的值!!不知道你是怎么想的。。
#11
a是student类型的指针,解引用后是一个student结构
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗
#12
lz的交换方式不是不是这样吗
void swit_stu(struct student *a,struct student *b)
{
struct student temp;
temp=*a;
*a=*b;
*b=temp;
}
这样交换的话,自然是把第一个成员stunum交换了啊,其它没变。
#13
而且那样的交换方式达不到目的。你运行过那样的方式可以达到交换的目的?
#14
指针指向的是整个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楼所说情况
#17
貌似确实是越界的问题……我把那个改了就可以了T^T。。。
题目告诉名字只存6个了^_^谢谢啊.而且我也知道名字超6个以后该怎么办^^
#18
那个交换是可以达到目的,学艺不精,让你笑话了。。以前没接触到过结构体交换,找些相关的东西看看。
顺便说一下8L的代码是可以正确运行的。
#1
进行内存拷贝(深拷贝)
#2
首先你这句if(st[j].age>st[j+1].age)当j = n -1时越界了。
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
你的交换可能没达到目的,你可以输出*a看一下,肯定不是结构体的全部内容。
你可以直接交换地址
void swit_stu(struct student *a,struct student *b)
{
struct student *temp;
temp=a;
a=b;
b=temp;
}
#3
最大问题估计是越界了,要么就是指针飞了…………改掉那个以后就好了。
你那个我试过了,没有效果
#4
我帮你调试了一下,有如下问题。
1. 结构体定义应该放在定义函数前,因为你的函数里用了该结构体。
2. 结构体交换问题,你的那个函数,在函数体内确实地址交换了,但是出函数后对结构体数组是没影响的,只是把两个地址参数拷贝了一份给函数。这里我的理解是,首先你是定义了结构体数组,它的地址是分配好的常量,结构体元素的地址是不能交换的,因为数组元素的地址是常量,不能作为左值。
修改后的代码如下:
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
你这样交换才是错的,lz的交换方法是正确的
#7
lz的结构体是POD类型,完全可以直接交换,不需要内存拷贝
#8
就是排序方法有点问题,还有是貌似多出一个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
lz那样的交换可以?我测试了一下,*a是第一个成员的值!!不知道你是怎么想的。。
#11
a是student类型的指针,解引用后是一个student结构
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗
我不知道你是用什么方式来测试的,a本身是一个地址,如果你去输出地址那肯定不是要的结果
student又没有定义输出的方法
然后所谓的第一个成员的值又是什么?stunum?难道你是printf("%d", *a);这样输出的?那倒是的确会出现那样的结果,你试过输出a里面的成员吗
#12
lz的交换方式不是不是这样吗
void swit_stu(struct student *a,struct student *b)
{
struct student temp;
temp=*a;
*a=*b;
*b=temp;
}
这样交换的话,自然是把第一个成员stunum交换了啊,其它没变。
#13
而且那样的交换方式达不到目的。你运行过那样的方式可以达到交换的目的?
#14
指针指向的是整个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楼所说情况
#17
貌似确实是越界的问题……我把那个改了就可以了T^T。。。
题目告诉名字只存6个了^_^谢谢啊.而且我也知道名字超6个以后该怎么办^^
#18
那个交换是可以达到目的,学艺不精,让你笑话了。。以前没接触到过结构体交换,找些相关的东西看看。
顺便说一下8L的代码是可以正确运行的。