qsort无法对大量字符串

时间:2015-06-30 21:04:14

标签: c sorting gcc

我正在使用qsort对大小为i的{​​{1}}字符串数组进行排序,例如256 - 在循环中使用reallocs完成。每个字符串在文本中包含一个数字,我将其用作比较元素:

char *arr = malloc(i * 256)

int cmp(const void *a, const void *b) { double atime = get_time((char*)a); double btime = get_time((char*)b); return (atime > btime) - (atime < btime); } 很小时,它就有效。使用大i时,无法正确排序数组。 i正在发挥作用。我以前使用它与自定义的heapsort实现,它完美无缺。

我在cmp中添加了以下内容以检查发生了什么:

get_time

似乎所有比较都是正确的,但并非所有的比较都是正确的。 fprintf(stderr, "Comparing %f to %f, result: %d.\n", atime, btime, (atime > btime) - (atime < btime)); 有几个包含arr的字符串,但是我找不到输出中大于1.something的数字之间的任何比较。对1的调用如下:

qsort

这与我用来传递给我的heapsort函数的参数相同,但它不起作用。

Complete codeexample file (fails to sort)

qsort((void*)arr, i-1, MAX_ROW_LEN, cmp);

1 个答案:

答案 0 :(得分:3)

我已经测试了你的代码和你的示例输入文件,它似乎工作正常。在你的问题中,你说:

  

...有几个包含1.something的字符串,但是我找不到   输出中大于1的数字之间的任何比较。

但是你的示例输入文件中没有这样的行。

给出输入的示例行:

12 0.475183170 rank3 STATE fill_row

get_time中的这一行将跳过双倍中的任何前导数字:

size_t tok = strcspn(event, " ") + 2;

strcspn返回在查找“needle”之前必须读取的字符数,因此在这种情况下它将返回2.然后将其添加2,然后将其作为指针偏移到{ {1}}字符串,表示您将指针传递给event而不是.475183170

无论如何,你最好只使用0.475183170

strchr

随后的char *tok = strchr(event, ' '); if (!tok) { return -1; } double ans = strtod(tok, NULL); 将为您跳过前导空格,因此您不需要超级幻想。