Qsort没有正确排序字符串数组

时间:2013-03-18 13:32:11

标签: c++ sorting

我正在尝试对声明为string *names1 = new string[1];的数组进行排序(数组的大小随着添加更多项而增长)。

我正在把它放在那里。排序前的数组中的项目是: novot svobodovaa novakj6 3 vondraj1234

调用qsort(names1, size, sizeof (string), compare);后,其中compare实现如此

int compare(const void * a, const void * b) {
return ( *(char*) a - *(char*) b);
}

我的数组中的项目以这种方式加扰 vondraj1234 novakj6 novot svobodovaa

有谁知道,哪些错误不允许我按字母顺序对数组进行排序?

2 个答案:

答案 0 :(得分:3)

您可以使用qsort类型,可以使用memcpy进行复制。 std::string(以及具有非平凡赋值运算符的任何其他类型)不符合条件。相反,请使用std::sort。它知道如何正确复制对象。

答案 1 :(得分:0)

我首先要挑选你问题质量稍差的东西,忍受我。

string *names1 = new string[1];

这将为您提供一(1)个字符串对象的数组。

  

(通过添加更多项目来增加数组的大小)

假。 数组的大小可能会这样做,因为您希望将代码写入此特定目的。 数组的大小不会自动调整。 (这是vector的用途。)

  

我正在把它放在那里。排序前数组中的项目为:novot svobodovaa novakj6 3 vondraj1234

在一个字符串中?还是作为一个字符串数组?在后一种情况下,我希望看到一些证据,如下:

for ( size_t i = 0; i < size; ++i )
{
    std::cout << i << ": " << names1[i] << "\n";
}

理想情况就在你的行之前:

qsort(names1, size, sizeof (string), compare);

(我只是希望并假设size实际上 的大小正确names1,这是我上面的小循环证明的另一件事。)


然而,你遇到麻烦的真正原因是:

return ( *(char*) a - *(char*) b);

您正在将string *(指向对象的指针)转换为char *(指向普通旧数据的指针),并且您正在使用C样式(char*)而不是C ++样式( static_cast< char * >()),所以你的编译器甚至不能正确抱怨。

当您取消引用这两个指针时,分别得到两个string对象的第一个字节。这很可能包含字符串的第一个字符,但是跳转表或机器代码。因此有点随机的结果......