所以我是结构的新手,所以我尝试像普通的冒泡排序一样对它进行排序,但是它无法正常工作,而且ti给我类似“将表达式分配给数组类型的错误”之类的错误。 我只想以相反的方式从“ z”到“ a”对鸡尾酒的名称进行排序。 我做了剩下的有效代码,却陷入了这种困境
我真的尽了我所能想到的一切,所以如果有人可以帮助我,那就太好了。 谢谢:)
typedef struct {
char name[20+1];
char sast1[20+1];
char sast2[20+1];
char sast3[20+1];
} kokteli;
j=i;
int s;
int flag;
char *pom;
while(1) {
flag = 0;
for(s=0; s<j; s++) {
if(k[s].name> k[s+1].name) {
pom = k[s].name;
k[s].name= k[s+1].name;
k[s+1].name= pom;
flag = 1;
}
} if(flag == 0){
break;
}
}
答案 0 :(得分:0)
所以我是结构新手,所以我尝试像平常一样对它进行排序 冒泡排序,但它不起作用,而且ti给我类似的错误 “将表达式分配给数组类型”
我不会谈论您的代码实际上试图实现的目的,但是我会解决您遇到的错误。编译器应该指出这两行:
k[s].name= k[s+1].name;
k[s+1].name= pom;
因此,为清楚起见,让我们指出一个事实,k
是一个kokteli
结构的数组,并且这些结构包含的成员是数组(name
,sast1
等)。 k[s].name
和k[s+1].name
都是char数组,在C中是不可分配的。您可以通过指向数组中每个char
的内存地址的指针来修改数组的元素(char
)。您将这样做:
k[s].name[n] = //where n is an integer from 0 to 20, assign value of nth element here)
让我们分解一下这句话:
kokteli
结构数组的指针k[s]
实际上是指向kokteli
结构的地址的指针,该结构位于从k
偏移s
的内存地址处(C中与{ {1}})(k+s)
实际上是指向位于偏移k[s].name
处的name
结构的成员kokteli
的地址的指针(也可以用C编写为{{1 }}或s
)(k+s)->name
是&k[s] //since the first member is name
结构的成员k[s].name[0]
的第0个元素的内容,该元素位于从name
偏移kokteli
(也可以用k
用C编写)这就是为什么编译器不抱怨这一行的原因:
s
现在需要注意的是,C语言中的数组名称实际上是指向该数组内容开头的内存地址。这意味着它本身就是一个指针。因此,由于*(k+s)->name
和pom = k[s].name;
实际上都是pom
,所以k[s].name
现在指向char *
指向的对象。
此处的if子句:
pom
实际上是比较内存地址,因为k[s].name
和if(k[s].name > k[s+1].name){
...
}
都指向数组中的第一个元素。区别在于,其中一个位于比另一个(即k[s].name
)大k[s+1].name
的内存偏移处,因此该语句永远不会为sizeof(kokteli)
。我为您here编写了一些代码,这些代码将钉住这个家。
正如评论中的其他人所指出的,您实际上将要使用strcmp(需要k[s+1].name
)来比较类型为true
的两个数组的元素。位于here的strcmp参考。
所以您的if子句应该看起来像这样
#include <string.h>
有关strcmp如何工作的更多信息,请参见此answer。