C中字符数组的快速排序数组
Posted
技术标签:
【中文标题】C中字符数组的快速排序数组【英文标题】:Quick sorting array of arrays of chars in C 【发布时间】:2022-01-21 15:49:23 【问题描述】:我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个无法调试的分段错误错误。这是代码:
int partition(char **a, int left, int right)
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
do
i++;
while (i <= right && strcmp(a[i], pivot) < 0);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
void quickSortChar(char **a, int left, int right)
int j;
if (left < right)
j = partition(a, left, right);
quickSortChar(a, left, j - 1);
quickSortChar(a, j + 1, right);
int main()
char **arr = (char **)calloc(10, sizeof(char *));
arr[0] = (char *)malloc(16);
arr[1] = (char *)malloc(16);
arr[2] = (char *)malloc(16);
arr[0] = "patata";
arr[1] = "berenjena";
arr[2] = "alioli";
quickSortChar(arr, 0, 2);
更新 1
使用strcpy
也不起作用:
int partition(char **a, int left, int right)
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
do
i++;
while (strcmp(a[i], pivot) < 0 && i <= right);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
更新 2
我已经通过上移声明解决了警告。
更新 3
修复while (i <= right && strcmp(a[i], pivot) < 0);
【问题讨论】:
最近有人问,使用strcpy()
复制一个字符串。 arr[0] = "patata";
等会覆盖您分配的指针。
您还必须提供声明以满足对函数partition()
的前向引用或移动该函数。不要忽略编译器警告。
我尝试过使用 strcpy,但它不起作用。我也解决了警告,但结果相同。
您正在分配内存并在分配静态字符串时立即泄漏它;不需要malloc
:char *arr[] = "patata", "berenjena", "alioli" ;
,你当然也不需要strcpy
。
这只是一个例子。在我的真实程序中,我有问题中描述的结构。
【参考方案1】:
请注意,您检查 i
仅在 strcmp(a[i], pivot) < 0
之后才超过 a
的长度,因此您到达 i=3
然后被转储。
改成
while (i <= right && strcmp(a[i], pivot) < 0);
我还建议使用calloc
而不是malloc
来初始化arr
【讨论】:
你是对的,但这并不能解决问题:( @AntonioGamizDelgado 我刚刚在我的电脑上运行了代码,没有任何错误 使用calloc?还是 malloc? 我正在使用 gcc -p t test.c && ./t 进行编译 @AntonioGamizDelgado 两者,用gcc -Wall tmp.c -o tmp
编译以上是关于C中字符数组的快速排序数组的主要内容,如果未能解决你的问题,请参考以下文章