Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C qsort无法对大型字符串数组进行排序_C_Sorting_Gcc - Fatal编程技术网

C qsort无法对大型字符串数组进行排序

C qsort无法对大型字符串数组进行排序,c,sorting,gcc,C,Sorting,Gcc,我正在使用qsort对大小为256的I字符串数组进行排序,例如char*arr=malloc(I*256)——实际上是在循环中使用reallocs完成的。在文本中,每个字符串包含一个数字,我将其用作比较元素: int cmp(const void *a, const void *b)

我正在使用
qsort
对大小为
256
I
字符串数组进行排序,例如
char*arr=malloc(I*256)
——实际上是在循环中使用reallocs完成的。在文本中,每个字符串包含一个数字,我将其用作比较元素:

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);                                     
}
似乎所有的比较都是正确的,但并不是所有的比较都是正确的
arr
有几个字符串包含
1。有些东西
,但是我在输出中找不到大于
1
的数字之间的任何比较。调用
qsort
如下:

qsort((void*)arr, i-1, MAX_ROW_LEN, cmp);
这与我过去传递给heapsort函数的参数相同,但不起作用

,及

#包括
#包括
#包括
#包括
#包括
#包括
#定义最大行长度256
#定义最大文件名长度256
/*返回事件的开始时间,如果没有时间,则返回-1*/
双稳态
获取时间(常量字符*事件)
{
如果(!event | | event[0]='%'))
返回-1;
尺寸=strcspn(事件“”)+2;
双ans=strtod(事件+tok,空);
如果(!ans)
返回-1;
返回ans;
}
/*静态内联*/int
cmp(常数无效*a,常数无效*b)
{
双时间=获取时间((字符*)a);
双b时间=获取时间((字符*)b);
返回(atime>btime)-(atimeMAX\u FILENAME\u LEN){
fprintf(stderr,“文件名太长。\n”);
退出(退出失败);
}
/*读文件*/
printf(“正在处理%s.\n”,argv[1]);
文件*f=fopen(argv[1],“r”);
如果(!f){
fprintf(stderr,“打开失败。错误号%d.\n”,错误号);
退出(退出失败);
}
char*trace=malloc(最大行长度);
char*header=malloc(最大行长度);
尺寸i=1,j=1;
而(fgets(道+(i-1)*最大行长,最大行长,f)){
/*(如果我们不能得到时间,这是标题的一部分)*/
如果(获取时间(跟踪+(i-1)*最大行长度)!=-1){
trace=realloc((void*)trace,(++i)*MAX_ROW_LEN);
}否则{
strncpy(标题+(j-1)*最大行长度,跟踪+(i-1)*最大行长度,
最大值(行长);
页眉=realloc((void*)页眉,(++j)*最大行长;
}
}
如果(!feof(f)){
fprintf(stderr,“读取文件时出错。错误号%d.\n”,ferror(f));
退出(退出失败);
}
printf(“读取%zu行。\n”,i);
fclose(f);
/*写标题*/
f=fopen(“外固定”、“w”);
如果(!f){
fprintf(stderr,“无法打开\u已修复。错误号%d。\n”,错误号);
退出(退出失败);
}
对于(尺寸k=0;k
我已经测试了您的代码和示例输入文件,它似乎工作正常。在你的问题中,你说:

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

但是在您的示例输入文件中没有这样的行

给出您输入的以下示例行:

12 0.475183170 rank3 STATE fill_row
strcspn
返回在找到“指针”之前必须读取的字符数,因此在本例中,它将返回2。然后将2添加到该值中,然后将其用作
事件
字符串中的指针偏移量,这意味着将指针传递到
.475183170
,而不是
0.475183170

您最好还是在这里使用
strchr

char *tok = strchr(event, ' ');
if (!tok) {
    return -1;
}
double ans = strtod(tok, NULL);

后续的
strod
将为您跳过前导空格,因此您无需过于花哨。

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

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

但是在您的示例输入文件中没有这样的行

给出您输入的以下示例行:

12 0.475183170 rank3 STATE fill_row
strcspn
返回在找到“指针”之前必须读取的字符数,因此在本例中,它将返回2。然后将2添加到该值中,然后将其用作
事件
字符串中的指针偏移量,这意味着将指针传递到
.475183170
,而不是
0.475183170

您最好还是在这里使用
strchr

char *tok = strchr(event, ' ');
if (!tok) {
    return -1;
}
double ans = strtod(tok, NULL);

后续的
strod
将为您跳过前导空格,因此您无需过于花哨。

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

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

但是在您的示例输入文件中没有这样的行

给出您输入的以下示例行:

12 0.475183170 rank3 STATE fill_row
strcspn
返回在找到“指针”之前必须读取的字符数,因此在本例中,它将返回2。然后将2添加到该值中,然后将其用作
事件
字符串中的指针偏移量,这意味着将指针传递到
.475183170
,而不是
0.475183170

您最好只使用