这是我的代码
#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()
引起了问题,但我不知道为什么。任何帮助都将非常感激。
答案 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()
分配的内存。