C语言 使用指针数组对一个列表进行两种排序



我正在尝试使用指针查看排序。数据的原始顺序,以及通过指针数组访问的字母顺序。但是有错。第一次打印显示按字母顺序排序。其实不然。我查看了适合我的插入排序算法。我的错在哪里?感谢您所有赞赏的答案。

#include <stdio.h>
#include <string.h>
#define MAX 3
void ins_sort(char *x_ptr[], int size);
int main(){   
    char x[MAX][20];
    char *x_ptr[MAX];
    int i;
    for(i=0 ; i < MAX ; i++){   
        scanf("%s" ,x[i]);
        x_ptr[i] = x[i];
    }
    ins_sort(x_ptr, MAX);
    printf("nn");
    for(i=0 ; i < MAX ; i++)
        printf("%sn", x_ptr[i]);
    printf("nn");
    for(i=0 ; i < MAX ; i++)
        printf("%sn", x[i]);
    return 0;
}
void ins_sort(char *x_ptr[], int size){
    int i,j;
    char *temp;
    for(i=1 ; i < size ; i++){
        temp = x_ptr[i];
        for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
            x_ptr[j] = x_ptr[j-1];
        }
        x_ptr[j] = temp;
    }
}

你的错误在这里:

    for(j=i ; j > 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){   /* >= must be > or j-1 = -1 */

j >= 0表面上的问题是你在比较strcmp(temp, x_ptr[j-1]).j = 0时,您比较了x_ptr[-1])分配了x_ptr[0] = x_ptr[-1];。您还将受益于修复scanf格式字符串。(我还添加了一个printf以便我知道代码提示的内容。完整更改:

#include <stdio.h>
#include <string.h>
#define MAX 3
void ins_sort(char *x_ptr[], int size);
int main(){   
    char x[MAX][20] = {{0}};
    char *x_ptr[MAX] = {NULL};
    int i = 0;
    for(i=0 ; i < MAX ; i++){   
        printf ("n enter x_ptr[%d] : ", i);
        scanf("%[^n]%*c" ,x[i]);
        x_ptr[i] = x[i];
    }
    ins_sort(x_ptr, MAX);
    printf("nn");
    for(i=0 ; i < MAX ; i++)
        printf("%sn", x_ptr[i]);
    printf("nn");
    for(i=0 ; i < MAX ; i++)
        printf("%sn", x[i]);
    return 0;
}
void ins_sort(char **x_ptr, int size){
    int i = 0, j = 0;
    char *temp = NULL;
    for(i=1 ; i < size ; i++){
        temp = x_ptr[i];
        for(j=i ; j > 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
            x_ptr[j] = x_ptr[j-1];
        }
        x_ptr[j] = temp;
    }
}

例:

$ ./bin/ptrsort
 enter x_ptr[0] : bac
 enter x_ptr[1] : cab
 enter x_ptr[2] : abc

abc
bac
cab

bac
cab
abc
很明显,通过

gdb运行您的代码,您正在执行与x_ptr[-1]的比较,这导致您在离开函数时偏离Undefined Behaviorsegfault(如果不是彻底崩溃):

39              for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
(gdb) info locals
i = 1
j = 0

最新更新