使用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
相关产品推荐
相关产品推荐

