C排序字符串数组

C排序字符串数组,c,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 generate

我正在尝试对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;
}
#包括
#包括
#包括
#包括
#定义n40
#定义最小值4
#定义最大值10
int-generateRandomNumber(int-low,int-high)/*在低和高之间生成随机数,包括*/
{
返回rand()%(高+1-低)+低;
}
内部组件(常数无效*a,常数无效*b)
{
常量字符*pa=*(常量字符**)a;
常量字符*pb=*(常量字符**)b;
返回strcmp(pa,pb);
}
int main()
{
字符字[N][MAX+1];
int i,j;
整数长度;
srand(时间(空));
对于(i=0;i
您未正确铸造:

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);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);

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

您编写的程序就像words具有类型
char*words[N]
(指向C字符串的指针数组)一样。但是您的类型是
charwords[N][MAX+1]
。它的平面数组,编译器可以把它翻译成
字符[N*(MAX+1)]

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

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

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

在字符串中,比较函数的更改

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

应该是:

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

    return strcmp(pa, pb);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);

应该是:

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

    return strcmp(pa, pb);
}
const char* pa = (const char*)a;
const char* pb = (const char*)b;
qsort(words, N, sizeof(words[0]), comp);

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

首先启用所有编译器警告,然后阅读手册。您可以提供有关“崩溃”和错误的更多信息吗?1)
sizeof(char*)
-->sizeof(*words)2)
const char*pa=*(const char**)a;常量字符*pb=*(常量字符**)b-->
const char*pa=(const char*)a;常量字符*pb=(常量字符*)b返回strcmp((char*)a,(char*)b)
@SergioFormiggini您忘记了两个castsWhy中的
常量
?它在C中是冗余的。更详细地说,我会写:
qsort(words,N,(sizeof*words),(int(*)(void const*,void const*)strcmp)做一些测试我知道函数comp应该包含:
返回strcmp(*(char**)a,*(char**)b)和qsort可以是:
qsort(words、sizeof(words)/sizeof(char*)、sizeof(char*)、comp
如果words的类型为char*words[N],则这是正确的。