Řazení stringů ve struktuře v C rubrika: Programování: C/C++

4 Levin
položil/-a 15.12.2015
 
upravil/-a 15.12.2015

Ahoj, narazil jsem na problém, který nedokážu vyřešit. Načitám ze vstupu dvě data, číslo a libovolně dlouhý řetězec. Číslo načítám pomocí scanf, řetězec pomocí getline, která si alokuje pamět přímo pro ten string, jenom na poslední místo přidávám znak '\0', abych s tím daným řetězcem mohl následně pracovat. Data uchovávám v dynamický struktuře, která vypadá takto

typedef struct data
{
  char *most = NULL;
  int pocet;
} DATA;

Alokace na 2 místa, a podle potřeby zvětšuji vždy o dvojnásobek. Uvádím příklad vstupů

4 A
5 K
1 Z
3 X

Načítám takto

DATA *s; // poté klasicky malloc
scanf( "%d", &s[k].pocet ); // kde k zvetšuji o 1 na konci cyklu
len = getline(&s[k].most, &len, stdin ); // len je nastaveno ze začátku na 0, poté na len-1 dávám ten znak '\0'

Teď bych ideálně potřeboval pole struktur setřídit pomocí knihovního qsortu, abych, když zadám s[0].pocet, tak aby na 1. místě bylo největší číslo, když s[0].most, tak string k danému číslu, tzn:

5 K
4 A
3 X
1 Z

Díky za každou radu.

EDIT: Díky Nobody, řazení funguje, akorát teď nefunguje realloc. Nechci zakládat další téma, tak se zeptám zde. Níže uvedu ukazku, jak mám malloc a realloc

i = 2, k = 0;
s = (DATA *)malloc( i * sizeof( *s ));
 
// pote v cyklu realloc
if( k >= i )
    {
      i *= 2;
      s = (s_FRAZE *)realloc( s, i * sizeof( *s ));
    }

Tady realloc končí chybou, co v něm dělám špatně?

EDIT2:, tak jsem upravil podmínku na k>=i - 1 a vše funguje

odkaz Vyřešeno
2 nixbody
odpověděl/-a 15.12.2015
int compare_items_desc(const void* first, const void* second)
{
    return ((const DATA*) second)->pocet - ((const DATA*) first)->pocet;
}
 
qsort(items, number_of_items, sizeof(DATA), compare_items_desc);

Komentáře

  • Levin : Díky, to funguje. Doplnil jsem dotaz, nefunguje realloc a nevím, jak na něho. 15.12.2015
  • nixbody : Neznam cely kod, ale predpokladam, ze typ DATA nebude ten samy jako s_FRAZE, tim padem je urcite spatne sizeof(*s) a pokud s neni typu void* (coz asi neni, protoze jinak je spatne i to prvni sizeof(*s)), tak je spatne i prirazeni v tom ifu, jelikoz se jedna o nekompatibilni typy. 15.12.2015
  • Levin : Ono mělo být DATA, nechtíc jsem zkopíroval uplně jinou realokaci z jiné funkce. Už jsem to označil za vyřešeno, vše funguje. 15.12.2015

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.