【问题标题】:qsort record(char array) in descending orderqsort 记录(char 数组)按降序排列
【发布时间】:2013-11-27 19:37:44
【问题描述】:

我正在尝试使用 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_asc(const void *p, const void *q)
{
    const record *pp = p;
    const record *qq = q;
    int n1, n2;

    n1 = strcmp(pp->name.first, qq->name.first);
    n2 = strcmp(pp->name.last, qq->name.last);

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

    return n2;
}

这是我的降序:

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;
}

我编译了它,但它不起作用,有什么想法吗?

谢谢

【问题讨论】:

  • 我很确定这行不通。你不确定?为什么不确定?
  • “我很确定这行不通”。您愿意详细说明吗,或者这应该是一个猜谜游戏?
  • 我编译了它,它没有打印出来,也没有降序和排序
  • 查看strcmp() 函数的输出,这将使您在需要制作模组的道路上走得更远,并解决这个问题...
  • qsort(list-&gt;data, list-&gt;nused, sizeof(record), sort_name_des); 这行看起来不对。 list->data 是一系列事物,还是只是一个项目?

标签: c sorting arrays qsort


【解决方案1】:

由于您在第二个函数中切换了指针,因此您需要保持相同的逻辑。

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

或者简单地说:

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

【讨论】:

    【解决方案2】:

    因为我不知道record_list *list长什么样子,那就是:

    我不确定qsort(list-&gt;data, list-&gt;nused, sizeof(record), sort_name_asc); 的说法是否正确,list-&gt;data 真的是一个数组,或者list-&gt;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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2018-06-21
      • 2021-12-15
      相关资源
      最近更新 更多