我试着学习c-library stdlib的qsort函数。 这甚至在c++ 但我不明白如何使用它们来排序c++字符串。 我不确定sizeof()运算符的参数是什么,以及我的compare_str代码是否正确。 我试过这段代码:

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    #include<string>

    int compare_str( const void *a, const void *b){
       string  obj = (const char*)a;
       string obj1 = (const char*)b;
       return obj.compare(obj1);
    }
    int main(){
        string obj[4] = {"fine", "ppoq", "tri", "get"};
        qsort(obj, 4, sizeof(obj[0].length()), compare_str);
        for( int i=0; i<4; i++)
            cout<<obj[i]<<endl;
        return 0;
    }

我的输出是:

ppoq
tri
get
fine

我无法弄清楚错误。 请帮忙。

#1楼 票数:11 已采纳

你不能也不能在std::string s数组上使用qsort 元素必须是普通类型 ,哪些字符串不是,因此行为是不确定的。 从25.5 / 4(“qsort”):

除非base指向的数组中的对象具有普通类型,否则行为是未定义的。

原因是qsortmemcpy周围的数组元素,这对于C ++对象来说是不可能的(除非它们非常简单)。


如果你有一个普通的类型,你可以使用这个通用的qsorter-comparator(但当然这是一个糟糕的主意,并且内联的std::sort总是更可取):

template <typename T>
int qsort_comp(void const * pa, void const * pb)
{
    static_assert<std::is_trivial<T>::value, "Can only use qsort with trivial type!");

    T const & a = *static_cast<T const *>(pa);
    T const & b = *static_cast<T const *>(pb);

    if (a < b)  { return -1; }
    if (b < a)  { return +1; }
    return 0;
}

使用: T arr[N]; qsort(arr, N, sizeof *arr, qsort_comp<T>); T arr[N]; qsort(arr, N, sizeof *arr, qsort_comp<T>);


不要使用它。 请改用std::sort

#2楼 票数:8

最好是面向C ++并为您的数组使用std :: sort:

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>

int main() {

   std::string obj[4] = {"fine", "ppoq", "tri", "get"};
   std::sort(obj, obj + 4);
   std::copy(obj, obj + 4, std::ostream_iterator<std::string>(std::cout, "\n"));
}

AFAIK - std::sort使用快速排序。

[更新]看到评论,std :: sort并不总是纯粹的快速排序。

[UPDATE2]

如果你想学习qsort - 将std::string更改为const char*并根据strcmp定义函数。 请记住,qsort将指针传递给数组中的元素 - 因此取消引用const void*以获取const char* 看到:

#include <stdlib.h>
#include <string.h>

int compare_cstr(const void* c1, const void* c2) 
{ 
   return strcmp(*(const char**)(c1), *(const char**)(c2)); 
}

int main() {

   const char* obj[4] = {"fine", "ppoq", "tri", "get"};
   qsort(obj, 4, sizeof(obj[0]), compare_cstr);
   std::copy(obj, obj + 4, std::ostream_iterator<const char*>(std::cout, "\n"));
}

#3楼 票数:3

问题是你给qsort一个C ++字符串数组。 在比较函数中,您似乎除了C字符串之外,因为您将它们转换为(const char *)。

另外,qsort的第三个参数,数据的大小,你实际上给出了错误的值。 sizeof(obj [0] .length())将导致sizeof(size_t),这显然是错误的。 sizeof(obj [0])会更正确,但请记住,qsort不会调用string的复制构造函数,这可能会导致问题。

我建议不要将qsort与C ++字符串一起使用。

请参阅PiotrNycz提供的答案以获得正确的解决方案。

#4楼 票数:0

您应该使用C ++标准库提供的std::sort模板函数(在<algorithm>头文件中)。 默认情况下, std::sort使用小于比较运算符来排序元素( std::string已经实现了operator< )。 如果需要指定排序条件(例如,不区分大小写的字符串比较),则std::sort允许您指定排序函数对象。

例:

#include <string>
#include <algorithm>

bool caseInsensitiveOrdering(const std::string& lhs, const std::string& rhs)
{
   // return true if lowercase lhs is less than lowercase rhs
}

int main()
{
    std::string names[] = {"chuck", "amy", "bob", "donna"};
    size_t nameCount = sizeof(names) / sizeof(names[0]);

    // Sort using built-in operator<
    std::sort(names, names + nameCount);

    // Sort using comparison function
    std::sort(names, names + nameCount, &caseInsensitiveOrdering);
}

#5楼 票数:-1

您的错误在qsort中的大小声明中。 期望的是成员的大小,在您的情况下,是一个字符串。 所以你想要使用:

qsort(obj, 4, sizeof(string), compare_str);

但是,您需要使用指向字符串的指针,而不是字符串本身。 然后,代码应如下所示:

int compare_str( const void *a, const void *b){
   const string*  obj = (const string*)a;
   const string* obj1 = (const string*)b;
   return obj->compare(*obj1);
}

// ...

string* obj[4] = { new string("fine"), new string("ppoq"),
                   new string("tri"), new string("get") };
qsort(obj, 4, sizeof(string*), compare_str);
// And delete the objects
for(int i = 0 ; i < 4 ; ++i) delete obj[i];

#6楼 票数:-1

适合我:

#include<iostream>
#include<cstdlib>
using namespace std;
#include<string>

int compare_str( const void *a, const void *b){
   string* obj = (string*)a;
   string* obj1 = (string*)b;
   return obj->compare(*obj1);
}
int main(){
    string obj[4] = {"fine", "ppoq", "tri", "get"};
    qsort(obj, 4, sizeof(string), compare_str);
    for( int i=0; i<4; i++)
        cout<<obj[i]<<endl;
    return 0;
}

  ask by Nivetha translate from so

未解决问题?本站智能推荐:

1回复

比较qsort中的字符串

每当我在 qsort 中比较字符串时,顺序都是完全错误的。 例如,输入是 但我的输出是 这是我的比较功能 不要告诉我使用 sort(),我不能为这个任务
1回复

在Qsort中使用strcmp()比较字符串

我目前正在按照descending order对objArray中obj元素的count字段进行排序,如您在下面的程序中看到的那样,但是我也希望我的程序检查是否正在使用两个当前的objA.count和objB.count字段在cmpfunc()中相等,然后检查objb.word字符串是否大于ob
5回复

如何在C++中对字符串使用qsort

我想使用qsort函数使用C ++对字符串中的字符进行排序。 但是它抛出: 如果任何人都可以提供一种有效的方法来做到这一点,那就太好了。
1回复

qsort比较字母顺序的字符串

我正在使用stdlib.h库随附的qsort()对字符串结构数组进行排序。 它本质上是一个字符串数组,但是具有包含该数组的结构。 例如: 然后,包含名称的节点数组将是: 我的问题是,我想对nodes_list进行排序,以便在打印以下内容时: 它按字母顺序打印所有名称。 我
4回复

Qsort基于C字符串中的列?

一个类项目涉及对字符串数组进行排序,每个字符串包含相等数量的列,如下所示: 该程序接受命令行参数以对其进行排序,并应打印出未修改的排序字符串。 我想使用strtok将每个字符串的副本分成多个列,并为每行制作结构,如下所示: 我的问题是qsort作为arg的比较函数指针。 如果我正确
1回复

qsort一个字符串数组,比较

我试图弄清楚如何将qsort与字符串数组一起使用。 我的代码如下所示。 但是,我每次都会收到“访问冲突读取位置0x ### ..”,但我不知道怎么了。 谁能发现我的问题? 编辑:感谢您的出色帮助。 你们永远是最好的。
2回复

字符串的C编程qsort-没有编译器错误的崩溃

首先,我从txt中获取符号,并在其中放置字符串“ znaky”。 之后,我只对字符串中的数字进行排序,然后将它们带到另一个字符串“ cifry”中,之后我想对它们进行qsort排序,但是程序出现了问题。 谁能帮我吗?
1回复

关于C语言中用于字符串数组的qsort[重复]

这个问题已经在这里有了答案: 如何将qsort用于字符串数组? 3个答案 我正在尝试使用qsort按字母顺序对字符串数组进行排序。 当我使用comp1 ,它将参数强制转换为char** ,效果很好。 但是,如果我使用comp2 ,则强制转换为char* 。 为什么