【问题标题】:qsort() - sorting an array of stringsqsort() - 对字符串数组进行排序
【发布时间】:2014-06-26 19:54:56
【问题描述】:

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

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

Code_Lineschar** - 指向char*s 的数组,每个数组都包含一个字符串或指向NULL。当包含 NULL 的字符串位于数组的末尾时,我想要做的是按字母顺序对所有字符串进行排序。 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 时有效,但在包含 NULL 时会失败...

【问题讨论】:

  • 如果你想把NULL放在最后,为什么你说NULL第一个小,第二个NULL第一个大?
  • element1element2 是指向数组中元素的指针,永远不能是 NULL
  • @chris 确实很糟糕,但代码仍然无法工作——当有 NULL 时,代码将无法工作。知道为什么会这样吗?当然,我可以制作自己的排序功能,但它不会像 'qsort()' 那样有效,而且我对崩溃的原因很感兴趣:P
  • @T.C.为什么不 ?数组包含指针,指针不能指向 NULL ? :P
  • @user3745476, qsort 提供了一个指向被比较元素的指针。由于被比较的元素始终存在,因此这些指针不能为空。它们指向的是空指针或字符串。

标签: c sorting qsort


【解决方案1】:

qsort 比较函数中,参数是指向您提供的数组元素的指针不是元素本身。被比较的元素显然是存在的,所以这些指针永远不能被定义为 NULL。您要检查的是特定 element 是否为 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;
}

【讨论】:

  • @user3745476 没有那么多代码行。实际阅读。
  • 哦,我只是没有得到 IF 语句的区别,非常感谢,它现在正在工作,我明白了:)
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2011-07-19
  • 2011-04-15
  • 2013-03-23
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多