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/8/sorting/2.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 qsort()-对字符串数组进行排序_C_Sorting_Qsort - Fatal编程技术网

C qsort()-对字符串数组进行排序

C qsort()-对字符串数组进行排序,c,sorting,qsort,C,Sorting,Qsort,这里似乎找不到任何问题的答案。 基本上我有这样一行代码: qsort(Code_Lines, number_of_lines, sizeof(char*), myCmp); 当code\u行是一个char**-当每一行都包含一个字符串或指向NULL时,指向一个char*数组。我要做的是,当包含NULL的字符串位于数组末尾时,按字母顺序对所有字符串进行排序。 code\u行中的每个字符串将按其前4个字符进行排序(每个字符串的长度不相等-前四个字符总是不同-提及从0001到9999)的数字),如果

这里似乎找不到任何问题的答案。 基本上我有这样一行代码:

qsort(Code_Lines, number_of_lines, sizeof(char*), myCmp);
code\u行
是一个
char**
-当每一行都包含一个字符串或指向NULL时,指向一个
char*
数组。我要做的是,当包含NULL的字符串位于数组末尾时,按字母顺序对所有字符串进行排序。
code\u行
中的每个字符串将按其前4个字符进行排序(每个字符串的长度不相等-前四个字符总是不同-提及从
0001
9999
)的数字),如果为空,则只将其放在数组的末尾。 变量
number\u of_line
包含数组中的行数(代码行),也称为数组中的元素数(在本例中为字符串)。 myCmp是我的比较函数,我是这样编写的:

int myCmp(const void* element1, const void* element2)
{
    int return_value;

    if(!element1) //element1 of them is NULL
    {
        return_value = 1;
    }
    else if(!element2) //element 2 is NULL
    {
        return_value = -1;
    }
    else
    {
        return_value = strncmp(*((char**)element1), *((char**)element2), 4);
    }

    return return_value;
}
知道问题出在哪里吗?程序就在那里崩溃了。
该函数在数组不包含NULL时工作,但在数组包含NULL时失败…

qsort
比较函数中,参数是指向您提供的数组元素的指针,而不是元素本身。被比较的元素显然是存在的,因此根据定义,这些指针永远不能为NULL。您要检查的是特定元素是否为
NULL
,而不是指向元素的指针:

int myCmp(const void* element1, const void* element2)
{
    int return_value;
    char * e1 = *(char **) element1;
    char * e2 = *(char **) element2;

    if(!e1) //element1 of them is NULL
    {
        return_value = 1;
    }
    else if(!e2) //element 2 is NULL
    {
        return_value = -1;
    }
    else
    {
        return_value = strncmp(e1, e2, 4);
    }

    return return_value;
}

如果你想把
NULL
放在末尾,为什么说第一个在
NULL
时更小,第二个在
NULL
时第一个更大?
element1
element2
都是数组中元素的指针,永远不能
NULL
@chris My bad确实如此,代码不起作用-当存在NULL时,代码就不起作用。知道为什么会这样吗?当然,我可以创建自己的排序函数,但它没有“qsort()”那么有效,我对崩溃原因很感兴趣:P@T.C.为什么不呢?数组包含指针,指针不能指向NULL?:P@user3745476,
qsort
提供指向所比较元素的指针。由于要比较的元素始终存在,因此这些指针不能为null。它们指向的不是空指针就是字符串。@user3745476代码行不多。事实上,请阅读。哦,我只是没有理解IF声明中的区别,非常感谢,它现在起作用了,我明白了:)