根据这个网站
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*))'
请帮忙
答案 0 :(得分:11)
请注意:将C字符串存储在二维char数组中是不常见的。拥有char *ary[]
更为正常,例如argv。无法使用qsort
和strcmp
直接对该类型进行排序,因为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更容易。