所以我有这个函数,该函数当前对插入的数组结构进行排序,并按字母顺序对其进行排序,如下所示:
void string_rearrangement(Employee payroll[], int size)
{
//declaring temporary struct
Employee temp;
int i = 0, j = 0;
for (i = 0; i <= size; i++)
{
for (j = i + 1; j <= size; j++)
{
if (strcmp(payroll[i].name, payroll[j].name) >0)
{
temp = payroll[i];
payroll[i] = payroll[j];
payroll[j] = temp;
}
}
}
}
有效。我已经测试过了这是我打印名称时得到的输出的屏幕截图:https://i.imgur.com/YhUzUa0.png
但是现在我想更改它,这样它就给我相反的字母顺序。我认为这只是将strcmp条件更改为<0,如图所示:
if (strcmp(payroll[i].name, payroll[j].name) <0)
但是当我这样做时,我会得到一些疯狂的输出,例如:https://i.imgur.com/JdI0v8b.png
我在代码之间进行的唯一更改是> 0,所以我不确定为什么会这样。
答案 0 :(得分:2)
row_number
您几乎可以肯定在这里使用select p.p_number, p.name, t.t_num, t.timestamp
from payers p
left join (select p_number, t_num, timestamp,
row_number() over (partition by p_number order by timestamp desc) rn
from trans t
where t.timestamp <= date '2017-07-31') t
on p.p_number = t.p_number and rn = 1
where p.p_number between 44545558 and 44545562
而不是for (i = 0; i <= size; i++)
{
for (j = i + 1; j <= size; j++)
。您正在越过数组界限进入不确定的行为。在更改排序顺序之前,您只是非常幸运地发现自己的代码可以正常工作。