1

我正在开发一个程序,该程序获取用户输入的单词列表,忽略大小写(大写和小写),然后使用函数 qsort 对它们进行排序。我在使用 qsort 时遇到问题,因为我不知道将什么作为第三项 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 中有问题的位置有'??' 感谢您提供的任何帮助!

这是一个任务

4

2 回答 2

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 代替普通数组和 std::sort 代替 qsort。

于 2013-04-25T17:51:15.543 回答
-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);
}
于 2013-04-25T17:48:52.907 回答