C 来自自定义排序函数的奇怪结果

C 来自自定义排序函数的奇怪结果,c,linux,sorting,C,Linux,Sorting,我试图创建一个排序函数,该函数接收指向动态创建内存(malloc)的指针、项的总数和项的最大大小 我当前的函数输出一个按字母顺序排列的列表,但最后的结果列在第一个位置。我无法用我的生命去理解代码的错误,导致这样的输出 int sort_array (char *array, int count, int size) { int i, j; char *temp; if((temp = malloc((size + 1) * sizeof(char))) == NULL)

我试图创建一个排序函数,该函数接收指向动态创建内存(malloc)的指针、项的总数和项的最大大小

我当前的函数输出一个按字母顺序排列的列表,但最后的结果列在第一个位置。我无法用我的生命去理解代码的错误,导致这样的输出

int sort_array (char *array, int count, int size)
{
    int i, j;
    char *temp;

    if((temp = malloc((size + 1) * sizeof(char))) == NULL)
    {
        fprintf(stderr, "sort_array: malloc failed\n");
        return(RETURN_FAILURE);
    }

    for (i = 0; i < (count * size); i += size)
        for (j = size; j < (count * size); j += size)
            if (strcmp(&array[i], &array[j]) < 0)
            {
                strcpy(temp, &array[i]);
                strcpy(&array[i], &array[j]);
                strcpy(&array[j], temp);
            }

    return(RETURN_SUCCESS);
}
主要内容:

intmain(intargc,char*argv[])
{
int x;
char*data=NULL;
char*temp=NULL;
struct dirent*文件名;
char*path=“/testing/i/m”;
整数计数=0;
DIR*DIR;
如果((dir=opendir(path))!=NULL)
{
而((filename=readdir(dir))!=NULL)
{
如果(文件名->文件名[0]!='。)
{
if((temp=realloc(数据,(计数+1)*字段大小*sizeof(字符)))==NULL)
{
免费(数据);
fprintf(stderr,“main:realloc失败\n”);
退出(退出失败);
}
数据=温度;
strcpy(&data[count++*字段大小],文件名->数据名);
}
}
closedir(dir);
}
其他的
{
fprintf(stderr,“main:无法读取目录内容\n”);
退出(退出失败);
}
排序数组(数据、计数、字段大小);
对于(x=0;x
排序例程的内部循环处理的项目太多,而且似乎应用了错误的顺序。要按升序正确排序,请执行以下操作:

for (i = 0; i < (count * size); i += size)
    for (j = size; j < (count * size); j += size)
        if (strcmp(&array[i], &array[j]) < 0)
用于(i=0;i<(计数*大小);i+=大小)
对于(j=大小;j<(计数*大小);j+=大小)
if(strcmp(&array[i],&array[j])<0)
应改为:

for (i = 0; i < (count * size); i += size)
    for (j = i + size; j < (count * size); j += size)
        if (strcmp(&array[i], &array[j]) > 0)
用于(i=0;i<(计数*大小);i+=大小)
对于(j=i+尺寸;j<(计数*尺寸);j+=尺寸)
if(strcmp(&array[i],&array[j])>0)

您是否也可以发布传递给函数的参数,以及如何打印结果以获得输出?泰,这就是问题所在。我没有在第一个元素上启动内部循环,因为我认为将第一个元素与第一个元素进行比较是多余的。我的不好。另外,当列出的结果与最后列出的第一个项目的顺序相反时,我更改了排序顺序。将第一个元素与自身进行比较是多余的。修改后的代码不能做到这一点。事实上,我提供的修改是为了确保每个位置
I
(根据外环)的值仅与后面位置(每个I)的值进行比较。仅当数组中出现在位置
i
之后的元素的值小于位置
i
处的值时,才需要交换。较早位置的值应具有较小的值,因为它们已被排序到位。
for (i = 0; i < (count * size); i += size)
    for (j = size; j < (count * size); j += size)
        if (strcmp(&array[i], &array[j]) < 0)
for (i = 0; i < (count * size); i += size)
    for (j = i + size; j < (count * size); j += size)
        if (strcmp(&array[i], &array[j]) > 0)