【问题标题】:How to use qsort() in an array structure in C language [closed]如何在 C 语言的数组结构中使用 qsort() [关闭]
【发布时间】:2018-02-21 11:48:32
【问题描述】:

我正在尝试使用 qsort() 对结构中的价格进行排序。排序后,结构中的元素(test)之一变为0。您能告诉我为什么以及如何解决它吗?

谢谢!

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int price;
    int test;
    int id;
} order;
order list[10];
int i = 0;

int compare (const void * a, const void * b)
{

  order *orderA = (order *)a;
  order *orderB = (order *)b;

  return ( orderA->price - orderB->price );
}

int main ()
{
    srand ( time(NULL) );

    printf("Before sorting\n");
    for(i=0; i<10; i++){ 
        list[i].price = rand()%10;
        list[i].test = rand()%10;
        list[i].id = i; 
        printf ("Order id = %d Price = %d Test = %d\n",list[i].id, list[i].price, list[i].test);           
    }
    printf("AFTER sorting\n");
    int n;
    qsort (list, 6, sizeof(order), compare);
    for (n=0; n<10; n++)
         printf ("Order id = %d Price = %d Test = %d\n",list[n].id, list[n].price, list[i].test);          
    return 0;
}

输出是:

排序前
订单 ID = 0 价格 = 4 测试 = 2
订单 ID = 1 价格 = 9 测试 = 3
订单 ID = 2 价格 = 5 测试 = 0
订单 ID = 3 价格 = 2 测试 = 8
订单 ID = 4 价格 = 8 测试 = 5
订单 ID = 5 价格 = 7 测试 = 4
订单 ID = 6 价格 = 9 测试 = 3
订单 ID = 7 价格 = 1 测试 = 1
订单 ID = 8 价格 = 8 测试 = 4
订单 ID = 9 价格 = 3 测试 = 3
分拣后
订单 ID = 3 价格 = 2 测试 = 0
订单 ID = 0 价格 = 4 测试 = 0
订单 ID = 2 价格 = 5 测试 = 0
订单 ID = 5 价格 = 7 测试 = 0
订单 ID = 4 价格 = 8 测试 = 0
订单 ID = 1 价格 = 9 测试 = 0
订单 ID = 6 价格 = 9 测试 = 0
订单 ID = 7 价格 = 1 测试 = 0
订单 ID = 8 价格 = 8 测试 = 0
订单 id = 9 价格 = 3 测试 = 0

【问题讨论】:

  • 您只对前 6 个元素进行排序。
  • 问题已解决。
  • 注意:为避免int溢出并处理所有int,请使用(orderA-&gt;price &gt; orderB-&gt;price) - (orderA-&gt;price &lt; orderB-&gt;price)而不是orderA-&gt;price - orderB-&gt;price
  • 一旦你将i 的声明移动到第一个for循环中,问题就很明显了。 See it here.

标签: c qsort


【解决方案1】:

排序后,改变

printf ("Order id = %d Price = %d Test = %d\n",list[n].id, list[n].price, list[i].test); 

printf ("Order id = %d Price = %d Test = %d\n",list[n].id, list[n].price, list[n].test);

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多