【发布时间】:2015-09-27 07:18:13
【问题描述】:
这是我的代码
#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() 导致了问题,但我不知道为什么。任何帮助将不胜感激。
【问题讨论】:
-
我必须为每个元素分配内存,以便可以将字符串复制到其中。当用户在没有输入任何内容后按下回车键时,就会发生循环中断。那部分不会给我带来任何问题
-
是的,我注意到我没有看到它是一个 char* 数组
-
“这部分不会给我带来任何问题” - 再猜一次。
int length = sizeof(word_list)/sizeof(char*);是错误的,除非您碰巧完全填充了所有30插槽。否则,您将对30-i不确定的指针以及您did 填充的任何指针进行排序。一旦这些垃圾指针到达您的比较器并调用strcmp(取消引用它们),您就调用了未定义的行为。 -
问题是你给
qsort()完整的指针列表,不管它们中有多少实际上指向有效数据。此外,如果用户碰巧输入了更多单词,您的代码会愉快地写到word_list的末尾。永远不要写这样的代码... -
它们没有被使用。通过告诉
qsort要排序的实际项目数(您读取的字符串数)对列表进行排序。使用您读取的字符串数打印结果。如果您对最后一个问题很认真,那么您可能应该投资a decent book or two on C