我的qsort在Linux中有什么问题?

我使用Mac OS来实现命令sortingfunction的一部分:我的代码的一部分是:

int compare(const void *p, const void *q) { return strcmp(*(char **)p, *(char **)q); } void sort_file(char *filename, int unique, int reverse) { /* TODO: Complete this function */ /* Note: you will probably need to implement some other functions */ char buf[1024][1024]; int i=0; FILE * fp; if(!(fp=fopen(filename,"r"))){ perror("Open error!"); exit(0); } while(fgets(buf[i],1024,fp)){ printf("%s",buf[i]); i++; } qsort(buf, i, sizeof(char *), compare); } 

结果总是显示segmentation fault: 11任何人都可以告诉我什么是问题以及如何修改它?

我仍然想知道,如果我不知道在一行和文件中的代码的最大尺寸,如何定义我的数组?

我从这个页面得到了这个想法: http : //www.anyexample.com/programming/c/qsort__sorting_array_of_strings__integers_and_structs.xml

你没有一个指针数组; 你有一个数组的数组。 数组数组中的每个元素都有一个1024 char固定步长。 qsort需要知道,而你没有告诉它。 首先改变这个:

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

对此:

 qsort(buf, i, sizeof *buf, compare); 

现在qsort知道每个“事物”在你的char数组中有多大。

接下来,你的比较器应该被改变来说明传递的地址,以及它与你的数组数组有关的内容。 传递给比较器的每个地址都是一个元素所在的位置。 但是你的元素是每个char[1024] 。 某些char[1024]的地址不是某个char** ,而是char(*)[1024] 。 这里没有涉及指针的指针。 您的比较器可以简单地为:

 int compare(const void *p, const void *q) { const char (*lhs)[1024] = p; const char (*rhs)[1024] = q; return strcmp(*lhs, *rhs); } 

接下来,在控制循环中没有限制器来防止数组溢出。 总之,这个:

 while(fgets(buf[i],1024,fp)) 

应该是这样的:

 while(i < 1024 && fgets(buf[i],1024,fp)) 

理想的情况下,1024应该表示为一个常量,以避免幻数喷洒。

最后,你正在泄漏一个打开的FILE*在你的函数中。 不是一个好计划。 确保fclose()你的文件指针。

我看到的问题:

错误的参数qsort

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

需要是:

 qsort(buf, i, sizeof(buf[0]), compare); 

由于buf+1buf之间的差异是1000个char ,所以使用sizeof(char*)作为第三个参数是错误的。

错误的参数compare铸造

原始指针的类型是char (*)[1000] ,而不是char** 。 因此你需要使用:

 int compare(const void *p, const void *q) { char (*p1)[1000] = (char (*)[1000])(p); char (*q1)[1000] = (char (*)[1000])(q); return strcmp(*p1, *q1); }