在 C 中为字符串数组实现快速排序 - 为什么我会收到 SIGABRT 错误?
Implementing Quicksort for an array of strings in C - why am I getting SIGABRT error?
我正在按照 this tutorial 在 C 中实现快速排序,但它假设要排序的是一个整数数组,而我正在尝试对字符串数组进行排序,据我所知这是一个数组字符数组,或 char array[][]
.
这是我最后的实现:
void quicksort(char array[100][100], int firstIndex, int lastIndex) {
int pivotIndex, index1, index2;
char temp[100];
if (firstIndex < lastIndex) {
pivotIndex = firstIndex;
index1 = firstIndex;
index2 = lastIndex;
//Sorting in Ascending order with quick sort
while(index1 < index2)
{
while(strcmp(array[index1], array[pivotIndex]) <= 0 && index1 < lastIndex)
{
index1++;
}
while(strcmp(array[index2], array[pivotIndex]) > 0)
{
index2--;
}
if(index1<index2)
{
//Swapping opertation
strcpy(temp, array[index1]);
strcpy(array[index1], array[index2]);
strcpy(array[index2], temp);
}
}
//At the end of first iteration, swap pivot element with index2 element
strcpy(temp, array[pivotIndex]);
--> strcpy(array[pivotIndex], array[index2]);
strcpy(array[index2], temp);
//Recursive call for quick sort, with partiontioning
quicksort(array, firstIndex, index2-1);
quicksort(array, index2+1, lastIndex);
}
}
还有我的main()
:
int main() {
int numStrings = 100, maxLen = 100;
char strings[numStrings][maxLen];
printf("Give me some strings, each on a new line, and write STOP to stop:\n");
char input[100];
scanf("%s", input);
int iteration = 0;
while (strcmp(input, "STOP") != 0) {
strcpy(strings[iteration], input);
iteration++;
scanf("%s", input);
}
quicksort(strings, 0, iteration);
int j;
printf("Your sorted strings:\n");
for (j = 0; j < iteration; j++) {
printf("%s\n", strings[j]);
}
return(0);
}
但是上面用箭头指示的行一直给我 SIGABRT 错误。我上面的代码有什么问题导致了这个?诚然,我是 C 的新手,所以如果我的实现有任何灾难性的愚蠢之处,请直接说出来。
您正在调用 quicksort(strings, 0, iteration);
,它将尝试访问可能存在内存访问冲突的 iteration
位置的元素。对于大小为 iteration
的数组,iteration-1
是最后一个元素。因此,您应该传递 iteration-1
而不是 iteration
.
此外,请检查迭代,因为它可能越界。
在strcpy(array[pivotIndex], array[index2]);
in quicksort
函数中,pivotIndex 和index2 可能相同,这可能会导致一些问题。看到这个问题:strcpy(array[pivotIndex], array[index2]);
我正在按照 this tutorial 在 C 中实现快速排序,但它假设要排序的是一个整数数组,而我正在尝试对字符串数组进行排序,据我所知这是一个数组字符数组,或 char array[][]
.
这是我最后的实现:
void quicksort(char array[100][100], int firstIndex, int lastIndex) {
int pivotIndex, index1, index2;
char temp[100];
if (firstIndex < lastIndex) {
pivotIndex = firstIndex;
index1 = firstIndex;
index2 = lastIndex;
//Sorting in Ascending order with quick sort
while(index1 < index2)
{
while(strcmp(array[index1], array[pivotIndex]) <= 0 && index1 < lastIndex)
{
index1++;
}
while(strcmp(array[index2], array[pivotIndex]) > 0)
{
index2--;
}
if(index1<index2)
{
//Swapping opertation
strcpy(temp, array[index1]);
strcpy(array[index1], array[index2]);
strcpy(array[index2], temp);
}
}
//At the end of first iteration, swap pivot element with index2 element
strcpy(temp, array[pivotIndex]);
--> strcpy(array[pivotIndex], array[index2]);
strcpy(array[index2], temp);
//Recursive call for quick sort, with partiontioning
quicksort(array, firstIndex, index2-1);
quicksort(array, index2+1, lastIndex);
}
}
还有我的main()
:
int main() {
int numStrings = 100, maxLen = 100;
char strings[numStrings][maxLen];
printf("Give me some strings, each on a new line, and write STOP to stop:\n");
char input[100];
scanf("%s", input);
int iteration = 0;
while (strcmp(input, "STOP") != 0) {
strcpy(strings[iteration], input);
iteration++;
scanf("%s", input);
}
quicksort(strings, 0, iteration);
int j;
printf("Your sorted strings:\n");
for (j = 0; j < iteration; j++) {
printf("%s\n", strings[j]);
}
return(0);
}
但是上面用箭头指示的行一直给我 SIGABRT 错误。我上面的代码有什么问题导致了这个?诚然,我是 C 的新手,所以如果我的实现有任何灾难性的愚蠢之处,请直接说出来。
您正在调用 quicksort(strings, 0, iteration);
,它将尝试访问可能存在内存访问冲突的 iteration
位置的元素。对于大小为 iteration
的数组,iteration-1
是最后一个元素。因此,您应该传递 iteration-1
而不是 iteration
.
此外,请检查迭代,因为它可能越界。
在strcpy(array[pivotIndex], array[index2]);
in quicksort
函数中,pivotIndex 和index2 可能相同,这可能会导致一些问题。看到这个问题:strcpy(array[pivotIndex], array[index2]);