qsort函数导致问题

时间:2015-07-09 05:08:29

标签: c arrays pointers qsort

这是我的代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define STRING_LENGTH 20
#define MAX 30

int read_string(char string[], int n);
int compare(const void*a, const void*b);

int main(){
    int i;

    char* word_list[30];
    char word[STRING_LENGTH + 1];

    for (i = 0; ; i++){
       printf("\nEnter a word.\n");
       read_string(word, STRING_LENGTH);

       if (word[0] == '\0')
           break;
       word_list[i] = (char *)malloc(STRING_LENGTH + 1);
       //free(word_list);
       strcpy(word_list[i], word);
    }

    int length = sizeof(word_list)/sizeof(char*);

    int j;

    qsort(word,length, sizeof(char*), compare);
    for (j = 0; word_list[j] != '\0'; j++)
        printf("%s\n", word_list[j]);

    return 0;
}

int compare(const void*element1, const void *element2){
    const char *string1 = *(const char**)element1;
    const char *string2 = *(const char**)element2;

    return strcmp(string1,string2);
}

int read_string(char string[], int n){
    int ch, i = 0;

    while ((ch = getchar()) != '\n')
        if (i < n)
            string[i++] = ch;
    string[i] = '\0';

    return i;
}

我的程序应该通过read_string函数读取字符串,然后使用strcpy将它们作为指针数组的元素放置,然后按字母顺序对名称进行排序。它编译并读取我的输入,但一旦到达qsort()就会崩溃。我知道qsort()引起了问题,但我不知道为什么。任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:3)

评论中指出了一些问题。主要是您使用不正确的指针调用qsort,并且使用不正确的成员数(30)而不是读取的字符串数。更正将是:

qsort (word_list, i, sizeof (char *), compare);

虽然您可以在qsort完成后使用哨兵停止打印,但为什么?您已经知道在i中读取了多少个字符串。简单地说:

for (j = 0; j < i; j++)
    printf ("%s\n", word_list[j]);

顺便说一下,能够在read_string中的任意数量的字符串之后停止输入是有用的。允许生成的键盘EOF通过ctrl+d(Windows上的ctrl+z发出输入结束信号)。 E.g:

while ((ch = getchar ()) != '\n' && ch != EOF)

答案 1 :(得分:2)

请注意,您要排序word_list而不是word

int main() {
  int i;

  char* word_list[30];
  char word[STRING_LENGTH + 1];

  for(i = 0; ; i++) {
    printf("\nEnter a word.\n");
    read_string(word, STRING_LENGTH);

    if(word[0] == '\0')
      break;

    word_list[i] = (char *)malloc(STRING_LENGTH + 1);
    strcpy(word_list[i], word);
  }

  // call qsort with the number of items in the wordlist
  qsort(word_list, i, sizeof(char*), compare);

}


int compare(const void*element1, const void *element2){
  const char **string1 = (const char**)element1;
  const char **string2 = (const char**)element2;

  return strcmp(*string1,*string2);
}

在调用word_list之前,您还应该将设置长度调用qsort()中的项目数,而不是单词中的字符数。

例如,如果您使用stdin中的两个单词进行了阅读,那么请拨打qsort()这样的qsort(word_list, 2, sizeof(char*), compare);

也许我还需要提一下,当你使用完单词列表后,你应该释放malloc()分配的内存。