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

最佳答案

您没有正确转换:

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** 时,您正在发送处理器来访问伪造的内存地址。

关于C 对字符串数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40783223/

相关文章:

c - Unisys 最新的大型机系统是否仍然使用补码表示?

c++ - 将静态 C 库与 C++ 代码链接时出现 "undefined reference to"错误

c - 编译代码时如何包含 -D_POSIX_C_SOURCE=200809

c - Codeblocks 中的第一个 C 程序

C : is there "lazy evaluation" when using && operator, 和 C++ 一样吗?

c - 跳转到特定行的末尾

我可以用全 0 初始化数组数组吗?

c++ - 定时器中断中的 ATMega32 C++ 对象

c - UDF 文件系统读取、蓝光元数据分区、带有 ISO 镜像的 libdvdread

c - 保存字符串转换的数据结构