尝试按字母顺序对数组进行排序
Trying to sort an array alphabetically
我正在尝试按字母顺序对二维数组进行排序。
首先,我创建了一个数组并用随机用户输入填充它,当按下“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;
}
好的,任何时候遇到分段错误,首先要看的是操作 points/arrays——在类 C 语言中,它们实际上是一回事。
查看您对 strcmp
的使用,并记住它需要一个 C 字符串。 C 字符串是一个以 null 结尾的数组。在第一次通过程序时,哪里会有一个 null 终止你的数组 name
?
答:没人知道。但是,如果没有发生,strcmp
将继续查找,直到它到达数据段的末尾,这会导致等待它 "segmentation fault".
还有几个问题:
你用 malloc 指针做什么? int * ptr
会给你 space 一个指针。
当 getch
可以完成工作时,您为什么还要为 scanf
烦恼?
看这里:
int i = 0;
if (ptr != NULL) {
do {
i++;
printf("Put in a first Name: ");
scanf("%s", name[i]);
...
}
...
请注意,名字将进入 name[1]
,而 name[0]
将保持未初始化的垃圾。然后 qsort
会将垃圾(指向)传递给 compare
,compare
会将其传递给 strcmp
。
我正在尝试按字母顺序对二维数组进行排序。
首先,我创建了一个数组并用随机用户输入填充它,当按下“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;
}
好的,任何时候遇到分段错误,首先要看的是操作 points/arrays——在类 C 语言中,它们实际上是一回事。
查看您对 strcmp
的使用,并记住它需要一个 C 字符串。 C 字符串是一个以 null 结尾的数组。在第一次通过程序时,哪里会有一个 null 终止你的数组 name
?
答:没人知道。但是,如果没有发生,strcmp
将继续查找,直到它到达数据段的末尾,这会导致等待它 "segmentation fault".
还有几个问题:
你用 malloc 指针做什么?
int * ptr
会给你 space 一个指针。当
getch
可以完成工作时,您为什么还要为scanf
烦恼?
看这里:
int i = 0;
if (ptr != NULL) {
do {
i++;
printf("Put in a first Name: ");
scanf("%s", name[i]);
...
}
...
请注意,名字将进入 name[1]
,而 name[0]
将保持未初始化的垃圾。然后 qsort
会将垃圾(指向)传递给 compare
,compare
会将其传递给 strcmp
。