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

使用qsort()与strcmp构建后缀数组无输出问题求助

问题修复方案

你的代码存在两个关键错误,直接导致程序无输出甚至异常退出:

1. qsort元素大小参数错误

qsort(suffixes, n, sizeof(int), cmp); 中第三个参数传入错误,你排序的是struct suffix类型的数组,因此应该传入sizeof(struct suffix),而非sizeof(int)。错误的元素大小会让qsort错误地访问内存,触发未定义行为(比如程序崩溃、无输出)。

2. 比较函数返回值不符合qsort规则

cmp函数将strcmp的结果强行转为1或0,但qsort要求比较函数:

  • 返回负数:表示第一个参数应排在第二个参数之前
  • 返回0:表示两个参数相等
  • 返回正数:表示第一个参数应排在第二个参数之后

当前的返回逻辑会打乱排序逻辑,甚至导致qsort进入死循环(这就是你看到程序停顿几秒后退出的原因),正确做法是直接返回strcmp的原始结果。


修复后的完整代码

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

struct suffix
{
    int index; 
    char *suff;
};

int cmp(const void *a, const void *b)
{
    const struct suffix *a1 = (const struct suffix *)a;
    const struct suffix *b1 = (const struct suffix *)b;  
    return strcmp(a1->suff, b1->suff);
}

int *buildSuffixArray(char *txt, int n)
{
    struct suffix suffixes[n];

    for (int i = 0; i < n; i++)
    {
        suffixes[i].index = i;
        suffixes[i].suff = (txt+i);
    }

    qsort(suffixes, n, sizeof(struct suffix), cmp);

    int *suffixArr = (int*)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        suffixArr[i] = suffixes[i].index;
    }

    return suffixArr;
}

void printArr(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]); // 增加空格,输出更易读
    }
    printf("\n");
}

int main()
{
    char txt[] = "banana";
    int n = strlen(txt);
    int *suffixArr = buildSuffixArray(txt, n);
    printf("following is suffix array for %s\n", txt);
    printArr(suffixArr, n);
    free(suffixArr); // 释放动态分配的内存,避免内存泄漏
    return 0;
}

额外优化说明:修复后的代码添加了free(suffixArr)来释放内存,同时在printArr中给输出数字增加空格,提升可读性。运行后正确输出应为:

following is suffix array for banana
5 3 1 0 4 2 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:45:56