我使用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+1
和buf
之间的差异是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); }