gpt4 book ai didi

c - 使用指针数组对一个列表进行两种排序

转载 作者:行者123 更新时间:2023-11-30 17:24:04 25 4
gpt4 key购买 nike

我正在尝试使用指针进行排序。数据的原始排序以及通过指针数组访问的字母顺序。但有一个错误。第一次打印显示按字母顺序排列。事实并非如此。我回顾了适合我的插入排序算法。我的错在哪里?感谢您的所有赞赏回答。

#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("\n\n");
for(i=0 ; i < MAX ; i++)
printf("%s\n", x_ptr[i]);

printf("\n\n");
for(i=0 ; i < MAX ; i++)
printf("%s\n", 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("\n\n");
for(i=0 ; i < MAX ; i++)
printf("%s\n", x_ptr[i]);

printf("\n\n");
for(i=0 ; i < MAX ; i++)
printf("%s\n", 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]进行比较,这导致您偏离未定义的行为 和离开函数时出现段错误(如果不是彻底崩溃):

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

关于c - 使用指针数组对一个列表进行两种排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com