使用qSort对字符串进行排序

时间:2010-09-21 06:47:25

标签: c++ qsort

根据这个网站

http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

我已经完成了对字符串进行排序的以下程序

#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char list[5][4]={"dat","mai","lik","mar","ana"};
int main(int argc, char *argv[])
{
    int x;
    puts("sortirebamde:");
     for (x=0;x>sizeof(list)/sizeof(char);x++)
     printf("%s\n",list[x]);
      qsort(&list,(sizeof(list)/sizeof(char)),sizeof(list[0]),strcmp);
    system("PAUSE");
    return EXIT_SUCCESS;
}

这是我得到的错误

13 C:\Documents and Settings\LIBRARY\Desktop\string_sortireba.cpp invalid conversion from `int (*)(const char*, const char*)' to `int (*)(const void*, const void*)' 
13 C:\Documents and Settings\LIBRARY\Desktop\string_sortireba.cpp   initializing argument 4 of `void qsort(void*, size_t, size_t, int (*)(const void*, const void*))' 

请帮忙

5 个答案:

答案 0 :(得分:11)

请注意:将C字符串存储在二维char数组中是不常见的。拥有char *ary[]更为正常,例如argv。无法使用qsortstrcmp直接对该类型进行排序,因为qsort会将char **而非char *传递给比较函数。这对效率有好处,指针可以交换而不是整个字符串。 Linux manpage for qsort有一些很好的示例代码,带有正确的比较函数。

您无法将strcmp直接传递给qsort作为其比较函数,因为qsort期望将指针传递给void,其中strcmp需要指向const char的指针。鉴于指向void的指针和指向char的指针之间需要相似,你可能可能使用强制转换(对于你的代码),但更简洁的方法是编写一个采用正确类型的函数:

int cmpstr(void const *a, void const *b) { 
    char const *aa = (char const *)a;
    char const *bb = (char const *)b;

    return strcmp(aa, bb);
}

但请注意,在C ++中,您通常希望使用std::sort代替qsort,并且可能使用std::string代替char *,这种情况下的排序变得更简单(通常也更快)。

答案 1 :(得分:1)

qsort的第四个参数将2个void *指针作为args。因此,您需要为自己定义一个比较函数。 有关详细信息,请参阅此link

答案 2 :(得分:0)

超越why qsort fails,不要在C ++中使用它。

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

char const* const raw_data[5] = {"dat", "mai", "lik", "mar", "ana"};

std::vector<std::string> data (raw_data, raw_data + 5);
// would rarely be a global

// see below for code that needs to go here

int main() {
  using namespace std;
  cout << "before: " << data << "\n";
  sort(data.begin(), data.end());
  cout << "after: " << data << "\n";
  return 0;
}

Boost具有流插入器重载以直接输出向量,但这里只有一个simple version。这会进入标题,而不是被连续复制和粘贴:

template<class Stream, class Iter, class Ch>
void write_sequence(Stream& s, Iter begin, Iter end, Ch const* initial, Ch const* sep, Ch const* final) {
  if (initial) {
    s << initial;
  }
  if (begin != end) {
    s << *begin;
    ++begin;
    for (; begin != end; ++begin) {
      if (sep) {
        s << sep;
      }
      s << *begin;
    }
  }
  if (final) {
    s << final;
  }
}

template<class T, class A>
std::ostream& operator<<(std::ostream& s, std::vector<T,A> const& value) {
  write_sequence(s, value.begin(), value.end(), "[", ", ", "]");
  return s;
}

答案 3 :(得分:0)

您可以将strcmp直接传递给qsort

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char list[5][4]={"dat","mai","lik","mar","ana"};
int main(int argc, char *argv[]) {
    int x;
    puts("unsorted:");
    for (x=0;x<sizeof(list)/sizeof(list[0]);x++)
        printf("%s\n",list[x]);

    qsort(list,sizeof(list)/sizeof(list[0]),sizeof(list[0]),strcmp);

    puts("sorted:");
    for (x=0;x<sizeof(list)/sizeof(list[0]);x++)
        printf("%s\n",list[x]);
//  system("PAUSE");
    return EXIT_SUCCESS;
}

使用C,而不是C ++

答案 4 :(得分:0)

更多C ++风格-如今-具有static_cast:

import pandas as pd
a=pd.read_html('https://www.sec.gov/Archives/edgar/data/1303652/000130365218000016/a991-01q12018.htm')
print (a[23])

在main()中:

int scmp(const void * s1, const void * s2)
{
    const char* _s1 = *static_cast<const char* const*>(s1);
    const char* _s2 = *static_cast<const char* const*>(s2);
    return strcmp(_s1, _s2);
}

使用vector和std :: sort更容易。