我试图通过使用指针来查看排序。数据的原始排序,以及通过指针数组访问的字母顺序。但是有错。第一次印刷显示按字母顺序排列。它没有。我查看了适合我的插入排序算法。我哪里错了?谢谢你们所有赞赏的答案。
#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;
}
}
答案 0 :(得分:0)
您的错误在这里:
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]
进行了比较,导致您在离开时Undefined Behavior
和segfault
偏离功能(如果不是完全崩溃):
39 for(j=i ; j >= 0 && strcmp(temp, x_ptr[j-1]) < 0 ; j--){
(gdb) info locals
i = 1
j = 0