Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C - qsort retazca

Najskor mam nejaky subor znakov tie vytriedim iba na jednociferne cisla a hodim do retazca. Ten retazec z cislami chcem vytriedit pomocou qsort ale nejde mi to neviem preco vsetko mam ako by malo byt

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Retazce.h"

int main()
{
    const int POCET=10;
    char *znaky=(char *)malloc(POCET*sizeof(char));
    char *cifry=(char *)malloc(POCET*sizeof(char));
    char *hladaneZnaky="0123456789";
    char *nasiel;
    char znak;
    int pocetPrvkov=-1;
    int kolkoKratAlokoval=1;
    FILE *fr;

    if((fr=fopen("zdroj.txt","r"))==NULL)
    {
        printf("Subor zdroj.txt neexistuje!\n");
        return 1;
    }

    while(fscanf(fr,"%c",&znak)!=EOF)
    {
        ++pocetPrvkov;
        if(pocetPrvkov%POCET==POCET-1)
        {
            ++kolkoKratAlokoval;
            znaky=(char *)realloc(znaky,POCET*kolkoKratAlokoval*sizeof(cha r));
        }
        znaky[pocetPrvkov]=znak;
    }
    printf("%s\n\n",znaky);
    pocetPrvkov=0;
    kolkoKratAlokoval=1;
    nasiel=strpbrk(znaky,hladaneZnaky);
    while(nasiel!=NULL)
    {
        if(pocetPrvkov%POCET==POCET-1)
        {
            kolkoKratAlokoval++;
            cifry=(char *)realloc(cifry,POCET*kolkoKratAlokoval*sizeof(cha r));
        }
        cifry[pocetPrvkov++]=*nasiel;
        nasiel=strpbrk(++nasiel,hladaneZnaky);
    }
    cifry[pocetPrvkov]='\0';
    printf("%s\n\n",cifry);
    pocetPrvkov++;
    qsort(cifry,pocetPrvkov,sizeof(char*),comp);
    printf("%s\n",cifry);
    free(znaky);
    fclose(fr);
    return 0;
}

int comp(const void *a,const void *b)
{
    return strcmp(*(char **)a,*(char **)b);
}
Předmět Autor Datum
jezisikriste nový
MM.. 08.03.2014 15:27
MM..
to je :D nový
Hilfiger 08.03.2014 15:30
Hilfiger
Ked odhliadnem od toho zbytku ktory je skrabanie sa pravou rukou okolo zadku cez zachod za lavym uch… nový
MM.. 08.03.2014 15:44
MM..
Resp. jednoduchsie je tu comp funkciu urobit ako return ( *(char*)a - *(char*)b ); nový
MM.. 08.03.2014 15:50
MM..
A to pocetPrvkov++; pred qsort je nezmysel. nový
MM.. 08.03.2014 15:47
MM..
Dakujem ti moc za tvoju snahu precitat to po mne :) :D keby si mi povedal prosim ta co sa ti este ne… nový
Hilfiger 08.03.2014 16:02
Hilfiger
Napr. fscanf(fr,"%c",&znak) je skrabanie okolo zadku ekvivalent omnoh orychlejsej funkcie fgetc Zbyt… nový
MM.. 08.03.2014 16:07
MM..
A este to s tym kolkokrat realokoval a neustalym delenim a nasobenim resp. zbytkom po deleni je neef… nový
MM.. 08.03.2014 16:13
MM..
.. a takto definovany celok (2 integery a smernik + fcia na pridanie znaku) sa daju zapuzdrit do obj… nový
MM.. 08.03.2014 16:21
MM..
Dakujem za rady idem sa do toho pustit :) nový
Hilfiger 08.03.2014 16:26
Hilfiger
OOP class nemusis robit :) Zbytok mozes ak sa ti chce :) nový
MM.. 08.03.2014 16:30
MM..
A funguje teda uz ten qsort? Ja som to pisal zhlavy, ja tie veci co sem pisem netestujem :) nový
MM.. 08.03.2014 17:22
MM..
MM.. zivis sa kodenim ? kde alebo ako si sa naucil dobre kodit :) ď za odpoved :)) poslední
majklxxx_2014 09.03.2014 11:35
majklxxx_2014

Ked odhliadnem od toho zbytku ktory je skrabanie sa pravou rukou okolo zadku cez zachod za lavym uchom, tak k tomu qsort: pole cifry je pole charov, a ne pole smernikov. T.j. jeden prvok je sizeof (char) a ne sizeof(char*). Vo funkcii comp mas porovnavat priamo jednotlive elementy, co znamena jednotlive znaky, a ne strcmp. T.j.
if ( *(char*)a < *(char*)b ) return -1;
if ( *(char*)a == *(char*)b ) return 0;
return 1;

Napr. fscanf(fr,"%c",&znak) je skrabanie okolo zadku ekvivalent omnoh orychlejsej funkcie fgetc
Zbytocne si ukladas cely subor ked ho nepotrebujes, staci ti ukladat len cifry hned v cykle while((c=fgetc())!=EOF)
Na test cifry je napr. rychla fcia isdigit(), a ne prehladavanie pola
Netestujes si navratovu hodnotu malloc a realloc oproti NULL, a pracujes veselo so smernikom ktory moze byt NULL

A este to s tym kolkokrat realokoval a neustalym delenim a nasobenim resp. zbytkom po deleni je neefektivne a neprehladne. Efektivne a jasne je to vtedy ked si urobis

int Alokovane = 0;
int Obsadene = 0;
char* cifry = NULL;

a potom pridavanie znaku je napr.

if(Obsadene >= Alokovane) // potrebujem alokovat
{
 Alokovane += GRANULARITA;
 if(cifry == NULL) cifry=malloc(Alokovane);
 else cifry=realloc(cifry,Alokovane);
}
if(cifry!=NULL)
 cifry[Obsadene++] = znak;

//edit: trochu som zjednodusil to if, na >=, je to efektivnejsie jak +1>

Zpět do poradny Odpovědět na původní otázku Nahoru