Сортировка в C обычно выполняется с использованием qsort
.Интерфейс является общим, только функция сравнения является специфической для требований сортировки.
Если предположить, что элементы массива являются C-строками, тогда функция сравнения в этом случае может выглядеть следующим образом:
#include <string.h>
int cmp(const void * pv1, const void * pv2)
{
const char * const * pp1 = pv1;
const char * const * pp2 = pv2;
const char * p1 = *pp1 ?*pp1 :""; /* Let's do it the ORxCLx way and tolerate NULLs, by treating them as empty-string. */
const char * p2 = *pp2 ?*pp2 :""; /* Same. */
/* Try to get space between 1st and 2nd word: */
const char * pb1 = strchr(p1, ' ');
const char * pb2 = strchr(p2, ' ');
/* In case there was no 1st space
make begin point to right after the 1st word's end: */
pb1 = pb1 ?pb1+1 :p1 + strlen(p1);
pb2 = pb2 ?pb2+1 :p2 + strlen(p2);
/* Try to get space between 2nd and 3rd word: */
const char * pe1 = strchr(pb1, ' ');
const char * pe2 = strchr(pb2, ' ');
/* In case there was no 2nd space
make end point right after the 2nd's word's end: */
pe1 = pe1 ?pe1 :pb1 + strlen(pb1);
pe2 = pe2 ?pe2 :pb2 + strlen(pb2);
/* Calculate 2nd word's length: */
size_t s1 = (size_t)(pe1 - pb1);
size_t s2 = (size_t)(pe2 - pb2);
return strncmp(pb1, pb2, s1 > s2 ?s2 :s1);
}
Используйте это так:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *, const void *);
int main(void)
{
const char * as[] = {
"e 5 y",
"b 2",
"c 3 z",
"d 4 x",
"c 3 ",
"a 1",
"c 3"
};
qsort(as, sizeof as / sizeof *as, sizeof *as, cmp);
for (size_t i = 0; i < sizeof as / sizeof *as; ++i)
{
printf("'%s'\n", as[i]);
}
}
и получите:
'a 1'
'b 2'
'c 3 z'
'c 3'
'c 3 '
'd 4 x'
'e 5 y'