在c中按字母顺序对字符串数组排序
我有一个链接列表,我需要按字母顺序排序 我要把字符串复制到数组中,然后按字母顺序排序和打印在c中按字母顺序对字符串数组排序,c,arrays,sorting,C,Arrays,Sorting,我有一个链接列表,我需要按字母顺序排序 我要把字符串复制到数组中,然后按字母顺序排序和打印 void DisplayAll(k *l,p *p) { int i,j; p *temp; temp = malloc(l->num*sizeof *temp); for (i = 0; i < l->num; i++) { strcpy_s(temp[i].name, 20, p->name); p = p->next; i++; } for (i
void DisplayAll(k *l,p *p)
{
int i,j;
p *temp;
temp = malloc(l->num*sizeof *temp);
for (i = 0; i < l->num; i++)
{
strcpy_s(temp[i].name, 20, p->name);
p = p->next;
i++;
}
for (i = 0; i < l->num - 1; i++){
for (j = i + 1; j< l->num; j++)
{
if (strcmp(temp[i].name, temp[j].name) > 0)
{
strcpy_s(temp->name,20, temp[i].name);
strcpy_s(temp->name[i],20, temp[j].name);
strcpy_s(temp->name[j],20, temp->name);
}
}
for (i = 0; i < l->num-1; i++){
printf("%s\n", temp[i].name);
}
}
每次运行时都会出现错误您的代码有几个问题: 首先:这看起来一点都不对劲:
strcpy_s(temp->name,20, temp[i].name);
strcpy_s(temp->name[i],20, temp[j].name);
strcpy_s(temp->name[j],20, temp->name);
根据:
第一个和最后一个参数的类型应为char*
。您已经将struct p.name
定义为char[20]
,因此temp->name[i]
将是char
类型
我猜你实际上是想做这样的事情:
//get struct p at offset i in temp, access member "name"
strcpy_s(temp[i].name, 20, temp[j].name);
int l_num = l->num;//you'll see why
for (i = 0; i < l_num; i+=2)//increment twice if you want/need to
{
strcpy_s(temp[i].name, 20, p->name);
p = p->next;
if (p == NULL)
{
l_num = i+1;//this is as far as we ought to go in the subsequent loops
break;//or handle error in some way
}
}
其次:您正在为temp
分配内存,但一旦完成(即当函数返回时),就无法释放它。换句话说,你有一个内存泄漏。当然,一旦你的程序退出,内存几乎肯定会被释放,但是如果你写的程序必须运行很长的时间,像这样的函数会被多次调用,你的内存消耗会逐渐增加,你不希望这种情况发生。简而言之,在最后一个循环(打印所有内容)之后,添加以下内容:
free(temp);
编辑
您现在已经添加了免费
呼叫,并且-正确地-将其包装在if(temp)
中。但是:如果malloc
返回了一个NULL
指针,您不认为应该在函数的开头就这样做吗
temp = malloc(l->num * sizeof *temp);
if (!temp)
return;//or return int to indicate error or or exit EXIT_FAILURE; or something
您没有理由在未成功分配内存的情况下达到空闲(temp)
Third:正如@Bluepixy在他的评论中指出的那样,还有一个语法错误:if(strcmp(temp[i].name,temp[j].name)>0
分支从未正确关闭过:在第三次strcpy\u
调用之后缺少一个结束括号
最后,您分配了足够的内存来容纳l->num
结构。初始化它们的方式是,将为每个其他结构分配列表中下一个struct p
的name
成员。您没有真正确保p->next
不是空指针。这可能会导致问题(取消对空指针的引用)。因此,将第一个循环更改为如下内容:
//get struct p at offset i in temp, access member "name"
strcpy_s(temp[i].name, 20, temp[j].name);
int l_num = l->num;//you'll see why
for (i = 0; i < l_num; i+=2)//increment twice if you want/need to
{
strcpy_s(temp[i].name, 20, p->name);
p = p->next;
if (p == NULL)
{
l_num = i+1;//this is as far as we ought to go in the subsequent loops
break;//or handle error in some way
}
}
int l_num=l->num//你会明白原因的
对于(i=0;iname);
p=p->next;
if(p==NULL)
{
l_num=i+1;//这是我们在后续循环中应该达到的极限
break;//或以某种方式处理错误
}
}
在此之后,更换所有;inum使用i
或j
在循环中设置条件,以避免使用未初始化的字符串值
最后一个提示:如果您没有处理任何时间紧迫的问题,那么使用calloc
而不是malloc
可能会很有用,尤其是在处理字符串时,或者使用memset(temp[i]>name,0,20)
以确保所有char[]
成员确实是空字符串。
如果您发现自己使用了大量的str*
函数(strncat
,strncpy
等等),甚至像temp[i]->name[0]='\0'这样简单的函数
可以让生活更轻松。而我得到了一个错误
。。。这是什么?这是什么-l->numoprod
?任何结构中都没有具有该名称的成员。我希望您实际的typedef
使用的名称比p
和k
p*p
使用另一个名称作为变量名-->p*np
。此外,如果{}
编辑问题/代码会使答案变得过时,甚至像我的答案一样“错误”,那么就没有}
了,这篇文章的后期读者就再也找不到上下文了。永远不要这样做