我试图按字母顺序对二维数组进行排序。
首先,我创建一个数组,用随机用户输入填充它,当推送" 0"输入停止程序打印原始数组。到目前为止这么好但现在我想用库中的qsort按字母顺序排序这个数组。不幸的是,我得到了一个" Segmentation fault(core dumped)"来自编译器。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
int compare (const void * a, const void * b ) {
return strcmp(a, b);
}
int main(void) {
printf("\n\nGeben Sie beliebig viele Vor- und Zunamen ein.\n");
int *ptr = malloc(sizeof(*ptr));
char name[MAX][MAX];
char key[] = "0";
int i = 0;
if (ptr != NULL) {
do {
i++;
printf("Put in a first Name: ");
scanf("%s", name[i]);
printf("%s\n", name[i]);
} while(strcmp(name[i], key) != 0); // compare if input = 0. -> if input zero then break
}
printf( "original input:\n" );
for( int j = 1; j < i; ++j )
printf( "%d: %s\n", i, name[j] );
// Here is the probleme, I get "Segmentation fault (core dumped)" from Compiler
qsort(name, i, 10*sizeof(name[0]), compare);
for (int k =0; k<i; k++) {
printf("%s\n",name[k]);
}
free(ptr);
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
好的,每当你遇到分段错误时,首先要看的是操纵点/数组 - 在类C语言中它们实际上是相同的。
看看你对strcmp
的使用,并记住它期待一个C字符串。 C字符串是以空值终止的数组。在第一次通过程序时,哪里会有一个null终止你的数组name
?
答案:没有人知道。但如果一个人没有发生,strcmp
会继续寻找,直到它到达数据段的末尾,这会导致等待它,#34;分段错误&#34;。
以下是其他几个问题:
你在做什么用malloc&#39; d指针? int * ptr
会为你自己提供指针空间。
当scanf
完成这项工作时,为什么还要为getch
而烦恼?
答案 1 :(得分:0)
看这里:
int i = 0;
if (ptr != NULL) {
do {
i++;
printf("Put in a first Name: ");
scanf("%s", name[i]);
...
}
...
请注意,名字将进入name[1]
,name[0]
将保持未初始化的垃圾。然后qsort
会将该垃圾邮件(指针)传递给compare
,然后将其传递给strcmp
。