C排序字符串数组

时间:2016-11-24 10:00:59

标签: c

我试图在C中对字符串数组进行排序但它无法运行。好像我误用了qsort。调用qsort时程序崩溃。我该如何修复我的代码。我应该使用const char * []而不是char [] []吗?为什么呢?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define N 40
#define MIN 4
#define MAX 10

int generateRandomNumber(int low, int high)/*generate random number between low and high inclusive*/
{
    return rand() % (high + 1 - low) + low;
}

int comp(const void* a, const void* b)
{
    const char* pa = *(const char**)a;
    const char* pb = *(const char**)b;

    return strcmp(pa, pb);
}

int main()
{
    char words[N][MAX + 1];
    int i, j;
    int length;
    srand(time(NULL));

    for (i = 0; i < N; ++i)
    {
        length = generateRandomNumber(MIN, MAX);
        for (j = 0; j < length; ++j)
        {
            words[i][j] = generateRandomNumber('a', 'z');
        }
        words[i][length] = '\0';
    }

    qsort(words, N, sizeof(char*), comp);

    for (i = 0; i < N; ++i)
    {
        printf("%s\n", words[i]);
    }

    return 0;
}

4 个答案:

答案 0 :(得分:1)

你没有正确投射:

int comp(const void* a, const void* b)
{
    const char* pa = *(const char**)a;
    const char* pb = *(const char**)b;

    return strcmp(pa, pb);
}

应该是:

int comp(const void* a, const void* b)
{
    const char* pa = (const char*)a;
    const char* pb = (const char*)b;

    return strcmp(pa, pb);
}

我不知道您的代码中是否存在其他问题,但是当您将void*转换为const char**时,您正在发送处理器以访问虚假的内存地址。

答案 1 :(得分:1)

您编写程序时,单词的类型为char *words[N](指向C字符串的指针数组)。但您的类型为char words[N][MAX + 1]。它的平面数组,编译器可以将其转换为char words[N * (MAX + 1)]

所以,如果你真的想保存单词类型,那么:

qsort(words, N, sizeof(*words), comp);

int comp(const void* a, const void* b)
{
    return strcmp(a, b);
}

答案 2 :(得分:0)

在字符串比较函数更改

const char* pa = *(const char**)a;
const char* pb = *(const char**)b;

 const char* pa = (const char*)a;
 const char* pb = (const char*)b;

答案 3 :(得分:0)

const char* pa = *(const char**)a;
const char* pb = *(const char**)b;

应该是:

const char* pa = (const char*)a;
const char* pb = (const char*)b;

qsort(words, N, sizeof(char*), comp);

应该是:

qsort(words, N, sizeof(words[0]), comp);

第三个参数表示数组的长度