我正在开发一个程序,它接受用户输入的单词列表,忽略这些情况(上部和下部),然后使用函数qsort对它们进行排序。我遇到qsort的问题,因为我不知道要传递什么作为第3项qsort(array,sizeOfArray,??,funcCompare)。有人能指出我正确的方向吗?
using namespace std;
int compare(const void* , const void*);
const int SIZE = 100;
void main()
{
int i = 0;
int s = 0;
size_t size = 0;
string words;
string list[SIZE];
for (i = 0; i < SIZE; i++)
{
cout << "Please enter a word. Press ^Z to quit: " << endl;
cin >> words;
transform(words.begin(), words.end(), words.begin(), ::tolower);
if (words.length() > size)
{
size = words.length();
}
list[i] = words;
if (cin.eof())
{
s = i;
break;
}
}
qsort(list, s, ?? , compare);
for (int j = 0; j < i; j++)
{
cout << list[j] << endl;
}
}
int compare(const void* p1, const void *p2)
{
char char1, char2;
char1 = *(char *)p1; // cast from pointer to void
char2 = *(char *)p2; // to pointer to int
if(char1 < char2)
return -1;
else
if (char1 == char2)
return 0;
else
return 1;
}
qsort中有问题的地方有'??'非常感谢您提供的任何帮助!
这是一项作业
答案 0 :(得分:3)
从技术上讲,你需要通过sizeof(string)
但是std :: string不是简单的类型,因此不允许使用qsort
对字符串数组进行排序。
4功能签名:
qsort(void *,size_t,size_t,int(*)(const void *,const void ));
由两个声明取代:
extern“C”void qsort(void base,size_t nmemb,size_t size,int( compar)(const void ,const void *));
extern“C ++”void qsort(void * base,size_t nmemb,size_t size,int( compar)(const void ,const void *));
两者都具有与原始声明相同的行为。除非这个行为是未定义的 base指向的数组中的对象是普通类型。
如果您使用的是C ++和std :: string,您还应该使用std :: vector而不是plain array和std :: sort而不是qsort。
答案 1 :(得分:-1)
您需要传递数组中每个元素的大小,以字节为单位。
这是通过以下方式完成的:sizeof(string)
qsort(list, s, sizeof(string), compare);
编辑:有关此
的更多信息,请查看alexrider的帖子我为BRL-CAD编写了一个qsort字符串比较函数,这里是使用的比较函数(记住用C编写,可以优化)。
* Sort function called by quick sort to sort data according
* to its second field in the string
*/
int
sort(const void* a, const void* b)
{
char *ia = *(char**)a;
char *ib = *(char**)b;
char Str[MAX_RESULT_LEN];
char Str2[MAX_RESULT_LEN];
//get string into array
GetStr(ia, Str);
GetStr(ib, Str2);
int n1 = atoi(Str);
int n2 = atoi(Str2);
return (n2 - n1);
}