尝试按字母顺序对数组进行排序

时间:2015-01-01 19:10:54

标签: arrays 2d qsort

我试图按字母顺序对二维数组进行排序。

首先,我创建一个数组,用随机用户输入填充它,当推送" 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;
}

2 个答案:

答案 0 :(得分:0)

好的,每当你遇到分段错误时,首先要看的是操纵点/数组 - 在类C语言中它们实际上是相同的。

看看你对strcmp的使用,并记住它期待一个C字符串。 C字符串是以空值终止的数组。在第一次通过程序时,哪里会有一个null终止你的数组name

答案:没有人知道。但如果一个人没有发生,strcmp会继续寻找,直到它到达数据段的末尾,这会导致等待它,#34;分段错误&#34;。

以下是其他几个问题:

  1. 你在做什么用malloc&#39; d指针? int * ptr会为你自己提供指针空间。

  2. 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