
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);
}
Dakujem ti moc za tvoju snahu precitat to po mne :) :D keby si mi povedal prosim ta co sa ti este nelubi na tom mojom zdrojaci bol by som moc rad keby som to mohol este vylepsit :)
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.
//edit: trochu som zjednodusil to if, na >=, je to efektivnejsie jak +1>
.. a takto definovany celok (2 integery a smernik + fcia na pridanie znaku) sa daju zapuzdrit do objektu, t.j. ponuka sa v OOP z toho vytvorit si class napr. DynamicArray, co v kazdom vyssom jazyku uz je urobene v nejakom frameworku :)
Dakujem za rady idem sa do toho pustit :)
OOP class nemusis robit :) Zbytok mozes ak sa ti chce :)
A funguje teda uz ten qsort? Ja som to pisal zhlavy, ja tie veci co sem pisem netestujem :)
MM.. zivis sa kodenim ? kde alebo ako si sa naucil dobre kodit :) ď za odpoved