You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中正确排序字符串数组?现有代码存在问题

二维字符数组的正确排序方法

原代码无法正常运行,主要存在三个问题:

  • 缺少必要的头文件:使用strcpy、strcmp、qsort等函数需要包含<string.h>、<stdlib.h>头文件,否则会触发编译错误;
  • qsort的元素大小参数错误:原代码用sizeof(char*)作为单个元素的大小,但d是char[5][10]类型的二维数组,每个元素是长度为10的字符数组,正确的单个元素大小应为sizeof(d[0])(等价于sizeof(char[10]));
  • 比较函数的指针转换未保留const修饰符:从const void*转换为字符串指针时未添加const限定,可能导致未定义行为。

修正后的完整代码

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

int my_compare(const void* a, const void* b)
{
    // 将指向二维数组元素的指针转换为const char*字符串指针
    const char* str1 = (const char*)a;
    const char* str2 = (const char*)b;
    // strcmp返回值直接作为排序依据:小于0则str1在前,大于0则str2在前
    return strcmp(str1, str2);
}

int main()
{
    char d[5][10];

    strcpy(d[0], "123456789");
    strcpy(d[1], "1");
    strcpy(d[2], "7");
    strcpy(d[3], "200000");
    strcpy(d[4], "300400000");

    // 修正qsort的元素大小参数
    qsort(d, 5, sizeof(d[0]), my_compare);

    // 输出排序结果验证
    for (int i = 0; i < 5; i++) {
        printf("%s\n", d[i]);
    }

    return 0;
}

关键细节说明

  • qsort参数的正确使用:
    • 第一个参数是待排序数组的起始地址,d作为二维数组名会自动退化为指向第一个元素(d[0])的指针;
    • 第二个参数是数组的元素总数,这里为5;
    • 第三个参数是单个元素的字节数,用sizeof(d[0])可以动态获取二维数组单个元素的大小,避免硬编码;
    • 第四个参数是自定义比较函数,qsort会通过该函数判断元素的先后顺序。
  • 比较函数的逻辑:
    strcmp函数按ASCII码顺序比较两个字符串:返回值小于0时str1排在前面,等于0时两字符串相等,大于0时str2排在前面。

内容的提问来源于stack exchange,提问作者Danijel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:55:28