我一直在嘗試在 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);
uj5u.com熱心網友回復:
您檢查的通知i沒有通過的長度a后,才strcmp(a[i], pivot) < 0因此你到達i=3,然后被人拋棄。
改成
while (i <= right && strcmp(a[i], pivot) < 0);
我還建議使用calloc而不是malloc為了初始化arr
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386833.html
