Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中按字母顺序对字符串数组排序_C_Arrays_Sorting - Fatal编程技术网

在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;//或以某种方式处理错误
}
}
在此之后,更换所有
;inumi
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
。此外,如果{}
编辑问题/代码会使答案变得过时,甚至像我的答案一样“错误”,那么
就没有
}
了,这篇文章的后期读者就再也找不到上下文了。永远不要这样做