我正在使用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 code和example file (fails to sort)。
qsort((void*)arr, i-1, MAX_ROW_LEN, cmp);
答案 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);
将为您跳过前导空格,因此您不需要超级幻想。