#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct train
{
int id;
int hours;
int minutes;
char destination[21];
};
// сравнивать поезда по каждому из параметров по возрастанию
// ввод: 2 указателя на 2 поезда
// возврат: больше 0, если поезд дальше в списке, меньше 0, если наоборот
int cmpTrains(void const *, void const *);
int cmpTrains(void const *voidTr1, void const *voidTr2)
{
int res;
struct train *tr1 = voidTr1;
struct train *tr2 = voidTr2;
if ((tr1->hours * 60 + tr1->minutes) -
(tr2->hours * 60 + tr2->minutes) != 0)
res = (tr1->hours * 60 + tr1->minutes) -
(tr2->hours * 60 + tr2->minutes);
else if (strcmp(tr1->destination, tr2->destination))
res = strcmp(tr1->destination, tr2->destination);
else res = tr1->id - tr2->id;
return res;
}
// Перевести строчку в вехний регистр
// Ввод: указатель на строчку
// Вывод: изменение строчки по указателю
void to_upper(char *);
void to_upper(char *str)
{
while (*str)
{
*str = toupper(*str);
str++;
}
return;
}
int main()
{
// N is amount of trains
int K, N;
struct train **ptrs = NULL;
scanf("%d%d", &K, &N);
// ptrs it is a pointer, that's reffering to other pointers to train objects.
ptrs = calloc(N, sizeof(struct train*));
for (int i = 0; i < N; i++)
{
ptrs[i] = (struct train *)malloc(sizeof(struct train));
scanf("%d %d:%d %s",
&ptrs[i]->id,
&ptrs[i]->hours,
&ptrs[i]->minutes,
ptrs[i]->destination);
to_upper(ptrs[i]->destination);
}
qsort((void *)ptrs, N, sizeof(struct train *), cmpTrains);
int cmp = 0, time;
printf("\n");
for (int i = 0; i < K; i++)
{
time = ptrs[i]->hours * 60 + ptrs[i]->minutes;
printf("%03d %02d:%02d %s %d\n", ptrs[i]->id, ptrs[i]->hours,
ptrs[i]->minutes, ptrs[i]->destination, time - cmp);
cmp = time;
}
for (int i = 0; i < N; i++)
free(ptrs[i]);
free(ptrs);
return 0;
}
控制台中的输入为:
4
6
124 12:02 habarovsk
13 12:02 VladiDMir
1 00:01 rOstov
101 23:05 MariuPl
911 17:15 Tagna
921 17:12 Esentuki
我有结构火车。我使用双指针将其中一些“火车”放入堆中。我决定使用内存转储窗口来调试我的项目。我想在堆中找到我的结构,但我发现这个代码块函数有一些模糊的行为。当我在搜索栏表达式“ptrs.destination”中输入时,它以某种方式获取对象“*ptrs[0]”的字段,或者因为它是表达式“ptrs[0]->destination”。我认为 ptr 没有任何字段,它只是一个指针。
我还尝试了其他一些表达式“ptrs->destination”、“(&ptrs)->destination”,这些表达式似乎无效,但结果都相同。
您是正确的,
ptrs.destination
不是有效的 C 表达式。
但是谁说地址框接受 C 表达式?