用于字符串数组的C ++中的qsort?

时间:2013-04-25 17:47:03

标签: c++ sorting qsort

我正在开发一个程序,它接受用户输入的单词列表,忽略这些情况(上部和下部),然后使用函数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中有问题的地方有'??'非常感谢您提供的任何帮助!

这是一项作业

2 个答案:

答案 0 :(得分:3)

从技术上讲,你需要通过sizeof(string)
但是std :: string不是简单的类型,因此不允许使用qsort对字符串数组进行排序。

25.5 C库算法

  

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);
}