qsort() - 排序字符串数组

时间:2014-06-26 19:54:56

标签: c sorting qsort

似乎无法在这里找到任何问题的答案。 基本上我有这行代码:

qsort(Code_Lines, number_of_lines, sizeof(char*), myCmp);

Code_Lineschar**时 - 指向char*个数组,每个数组包含一个字符串或指向NULL。我想要做的是当包含NULL的字符串位于数组的END时按字母顺序对所有字符串进行排序。 Code_Lines中的每个字符串将按其4个第一个字符排序(每个字符串的长度不相等 - 前四个字符总是不同的 - 提及00019999的数字),如果它为NULL,它将把它放在数组的末尾。 变量number_of_lines包含数组中的行数(代码行),AKA - 数组中的元素数(在本例中为字符串)。 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时有效,但在执行时失败...

1 个答案:

答案 0 :(得分:2)

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;
}