如何对存储在结构内的结构数组中的日期进行排序?
Posted
技术标签:
【中文标题】如何对存储在结构内的结构数组中的日期进行排序?【英文标题】:How to sort a date that stored in array of struct inside a struct? 【发布时间】:2021-03-16 04:38:28 【问题描述】:我在 C 中制作程序,我需要构建的功能之一是从多个用户和多个订单中排序日期,这就是我的结构和当前代码的样子,索引是多少用户注册
struct Order
int weight;
int status;
char date[8];
order;
struct User
char login[25];
char password[25];
int price;
struct Order order[25];
int manyOrder;
user;
for (i = 0; i < index - 1; i++)
for (int f = 0; f < user[i].manyOrder; f++)
for (int j = 0; j <= index - i - 1; j++)
if (strcmp(user[i].order[f].date, user[i].order[f + 1].date) > 0)
temp[0].order[0] = user[i].order[f];
user[i].order[f] = user[i].order[f + 1];
user[i].order[f + 1] = temp[0].order[0];
【问题讨论】:
您似乎缺少main
,和/或应该包含您发布的循环的函数。
它的程序很长,我认为它太长了,不能在这里发布
您的意思是对于每个用户,您要按日期对order[25]
进行排序?然后我建议制作一个单独的函数来对顺序数组进行排序。如果您使用strcmp
,还可以查看日期的存储方式:YYYYMMDD 可能是一个不错的选择。
@aryads 查看更新的答案。第一个发布的答案中有一个错误。现在已经修好了。
【参考方案1】:
在C语言中,当你在同一个句子中听到“排序”和“数组”这两个词时,你首先想到的应该是:qsort
qsort
将为您排序任何数组。您只需要编写一个比较函数即可。
类似:
int compare_func (const void * a, const void * b)
const struct Order* pA = a;
const struct Order* pB = b;
return strcmp(pA->date, pB->Date);
然后这样称呼它:
qsort(user[i].order, user[i].manyOrder, sizeof user[i].order[0], compare_func);
顺便说一句:我猜你想要 YYYYMMDD 格式的日期,它是 8 个字符。因此,要将其存储为字符串,您需要一个包含 9 个元素的数组,即一个额外的用于字符串终止的数组。换句话说:char date[8];
--> char date[9];
把它放在一起:
struct Order
int weight;
int status;
char date[9]; // Notice 9 instead of 8
; // Notice: Don't put "order" here. It will give a global variable
struct User
char login[25];
char password[25];
int price;
struct Order order[25];
int manyOrder;
; // Notice: Don't put "user" here. It will give a global variable
int compare_func (const void * a, const void * b)
const struct Order* pA = a;
const struct Order* pB = b;
return strcmp(pA->date, pB->date);
void print_user(const struct User* p)
puts(p->login);
puts(p->password);
printf("%d\n", p->price);
puts("------------");
for (int i = 0; i < p->manyOrder; ++i)
printf(" %d\n", p->order[i].weight);
printf(" %d\n", p->order[i].status);
printf(" %s\n", p->order[i].date);
puts("------------");
printf("%d\n", p->manyOrder);
int main(void)
struct User user[] =
"lg1", "pw1", 42, 1, 2, "20200601",3, 4, "20200501",5, 6, "20200401", 3,
"lg2", "pw2", 43, 10, 20, "20200601",30, 40, "20200501",50, 60, "20200401",70, 80, "20200801",90, 100, "20200501", 5
;
puts("BEFORE SORTING:");
for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
print_user(user+i);
for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
qsort(user[i].order, user[i].manyOrder, sizeof user[i].order[0], compare_func);
puts("");
puts("AFTER SORTING:");
for (size_t i = 0; i < (sizeof user/sizeof user[0]); ++i)
print_user(user+i);
return 0;
输出
BEFORE SORTING:
lg1
pw1
42
------------
1
2
20200601
3
4
20200501
5
6
20200401
------------
3
lg2
pw2
43
------------
10
20
20200601
30
40
20200501
50
60
20200401
70
80
20200801
90
100
20200501
------------
5
AFTER SORTING:
lg1
pw1
42
------------
5
6
20200401
3
4
20200501
1
2
20200601
------------
3
lg2
pw2
43
------------
50
60
20200401
30
40
20200501
90
100
20200501
10
20
20200601
70
80
20200801
------------
5
【讨论】:
以上是关于如何对存储在结构内的结构数组中的日期进行排序?的主要内容,如果未能解决你的问题,请参考以下文章