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_Arrays_Qsort - Fatal编程技术网

C 按降序排列的qsort记录(字符数组)

C 按降序排列的qsort记录(字符数组),c,sorting,arrays,qsort,C,Sorting,Arrays,Qsort,我正在尝试使用qsort按降序打印和排序记录的动态内存。我正在使用命令行来确定应该如何对记录进行排序 打印记录的代码: void print_records_by_name(record_list *list, int argc, const char *argv[]) { size_t i; if (argc == 2) { if (strcmp(argv[1], "+n") == 0) { qsort(list->data, l

我正在尝试使用qsort按降序打印和排序记录的动态内存。我正在使用命令行来确定应该如何对记录进行排序

打印记录的代码:

void print_records_by_name(record_list *list, int argc, const char *argv[])
{
    size_t i;

    if (argc == 2) {
        if (strcmp(argv[1], "+n") == 0) {
            qsort(list->data, list->nused, sizeof(record), sort_name_asc);
        } else if (strcmp(argv[1], "-n") == 0) {
            qsort(list->data, list->nused, sizeof(record), sort_name_des);
        }
    }

    for (i = 0; i < list->nused; i++) {
        fprintf(stdout, "%s %s %d\n", list->data[i].name.last, list->data[i].name.first, list->data[i].score);
    }
}
这是我的降序:

int sort_name_des(const void *p, const void *q)
{
    const record *pp = p;
    const record *qq = q;
    int n1, n2;

    n1 = strcmp(qq->name.first, pp->name.first); /*just switched the pp and qq*/
    n2 = strcmp(qq->name.last, pp->name.last); /*just switched pp and qq*/

    if (n2 != 0) {
        return n1;
    }

    return n2;
}
我编译了它,但它不起作用,有什么办法吗

谢谢

,因为我不知道
记录列表*列表
是什么样子,那就是:

我不确定语句
qsort(list->data,list->nused,sizeof(record),sort\u name\u asc)
是正确的,
list->data
实际上是一个数组,或者
list->used
实际上是数组中的项数

因此,我将简单地以升序和降序演示一个字符串比较,希望它能帮助您:

注意:比较函数与返回值相同,但返回值除外

#include <ansi_c.h>

static int sortstringAscending( const void *str1, const void *str2 );
static int sortstringDescending( const void *str1, const void *str2 );

int main(void)
{
    int i;
    char string1[10][4] = {"eee","bbb","jjj","ddd","aaa","fff","ggg","iii","hhh","ccc"};

    //Important that you populate the qsort function with the right values
    //that is qsort(StringArray, numElemetsInArray, sizeOfEachElement, sortFunction);

    qsort(string1, 10, 4,sortstringAscending);
    for(i=0;i<10;i++) printf("string %d is: %s\n", i, string1[i]);
    printf("\n");
    qsort(string1, 10, 4,sortstringDescending); 
    for(i=0;i<10;i++) printf("string %d is: %s\n", i, string1[i]);

    getchar();

    return 0;
}

static int sortstringAscending( const void *str1, const void *str2 )
{
    const char *rec1 = (const char *)str1;
    const char *rec2 = (const char *)str2;
    int val = strcmp(rec1, rec2);

    return val;
}

static int sortstringDescending( const void *str1, const void *str2 )
{
    const char *rec1 = (const char *)str1;
    const char *rec2 = (const char *)str2;
    int val = strcmp(rec1, rec2);

    return -1*val;//Because of the way strcmp() works, 
                  //this simple change causes the results 
                  //to be reversed for a string array
}
#包括
静态整型排序字符串加密(常量无效*str1,常量无效*str2);
静态int-sortstringdescinding(常量void*str1,常量void*str2);
内部主(空)
{
int i;
字符字符串1[10][4]={“eee”、“bbb”、“jjj”、“ddd”、“aaa”、“fff”、“ggg”、“iii”、“hhh”、“ccc”};
//重要信息是使用正确的值填充qsort函数
//即qsort(StringArray、numElemetsInArray、sizeOfEachElement、sortFunction);
qsort(string1、10、4、sortstringAscending);

对于(i=0;i,由于在第二个函数中切换了指针,因此需要保持相同的逻辑

if (n2 == 0) {
    return n1;
}
或者简单地说:

int sort_name_des(const void *p, const void *q)
{
    return -sort_name_asc(p, q);
}

我很确定这不起作用。你不确定?为什么你不确定?“我很确定这不起作用”。你想详细说明一下吗,或者这是一个猜测游戏?我编译了它,它也没有打印出来,也没有降序和排序查看
strcmp()的输出
函数,这将使您深入了解需要制作的MOD,并解决这个问题……
qsort(list->data,list->nused,sizeof(record),sort_name_des);
这行看起来不正确。list->data是一个数组还是一个项目?
int sort_name_des(const void *p, const void *q)
{
    return -sort_name_asc(p, q);
}