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);
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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