本问题已经有最佳答案,请猛点这里访问。
所以我在结构上是新手,所以我尝试像普通的冒泡排序一样对它进行排序,但是它无法正常工作,而且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
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;
}
}
请提供一个最小的可复制示例
请阅读帮助页面,尤其是有关如何提出良好问题和此问题清单的帮助。 最后,学习如何创建最小,完整和可验证的示例。
@ user3121023谢谢您,先生!
@Someprogrammerdude我会的。谢谢:)
请注意,尽管我已经将问题重复到有关比较字符串的问题上,但是您还需要使用函数(strcpy(),memmove(),memcpy() —也许是strncpy(),但要谨慎)复制字符串。 您正在尝试在数组上分配指针-不起作用。 您不能分配数组; 您不能将指针分配给数组(也就是说,给定char array[SIZE];,即使数组是结构的一部分,也不能执行array ="DATA";)。
非常感谢你! @乔纳森·莱夫勒
So I've been new in structures so i tried to sort it like normal
bubble sort but it won't work and also ti gives me error like
"assignment with expression to array type"
我不会说您的代码实际上试图实现什么,但是我会解决您遇到的错误。编译器应指出以下两行:
k[s].name= k[s+1].name;
k[s+1].name= pom;
因此,为清楚起见,让我们指出一个事实,即k是kokteli结构的数组,并且这些结构包含作为数组的成员(name,sast1等)。 k▼显示.name和k▼显示.name都是char数组,在C中不可分配。您可以通过指向数组中每个char的内存地址的指针来修改数组的元素(char)。您可以这样:
k[s].name[n] = //where n is an integer from 0 to 20, assign value of nth element here)
让我们分解一下这个语句:
k是指向kokteli结构数组的指针
k▼显示实际上是指向kokteli结构的地址的指针,该地址位于从k偏移s的内存地址处(C中与(k+s)完全相同)
k▼显示.name实际上是指向位于s偏移处的kokteli结构的成员name的地址的指针(也可以用C编写为(k+s)->name或&k▼显示 //since the first member is name)
k▼显示.name[0]是kokteli结构的成员name的第0个元素的内容,该元素位于从k偏移s的内存地址处(也可以用C编写为*(k+s)->name)
这就是为什么编译器不抱怨这一行的原因:
pom = k[s].name;
现在需要注意的是,C语言中的数组名称实际上是指向该数组内容开头的内存地址。这意味着它本身就是一个指针。因此,由于pom和k▼显示.name实际上都是char *,所以pom现在指向k▼显示.name所指向的对象。
您的if子句在这里:
if(k[s].name > k[s+1].name){
...
}
实际上正在比较内存地址,因为k▼显示.name和k▼显示.name都指向数组中的第一个元素。区别在于,其中一个位于比另一个(即k▼显示.name)大的sizeof(kokteli)内存偏移处,因此该语句永远不会是true。我在这里为您编写了一些代码,这些代码将钉住这个家。
正如评论中的其他人所指出的那样,您实际上将要使用strcmp(需要#include)比较两个类型为char的数组的元素。 strcmp的参考位于此处。
所以你的if子句应该看起来像这样
if(strcmp(k[s].name, k[s+1].name) > 0){
//k[s].name comes after k[s+1].name alphabetically
}
有关strcmp如何工作的更多信息,请参见此答案。