Witam.
Chce napisac funkje, ktora bedzie dostawala na wejsci TEKST rozdzielony SEPARATORAMI, wskazujemy jej tez argument KTORY mowiacy za ktorym separatorem chcemy wyciac z tekst slowo:
char *wytnij(char **tekst,char separator, int ktory);
np.
TEKST = "jeden||dwa|trzy"
SEPARATOR = '|'
KTORY = 2
Nie moge uzyc funkcji strtok gdyz ona ominie || czyli wtedy gdy miedzy separatorami nie ma nic.
Gdy ktory = 0 to oznacza ze chcemy wyciac slowo przed pierwszym separatorem.
Funkcja w wyniku zwraca wyciete slowo a tekst jest przekazywany przez referencje bo pod nim jest tekst z juz wycietym slowem.
char *wytnij(char **tekst,char separator, int ktory)
{
int licznik = 0;
char *beg,*end,*wynik,*tmp;
beg = &(*tekst[0]);
tmp = (char*)malloc(strlen(*tekst)*sizeof(char));
memset(tmp, '\0', strlen(*tekst)*sizeof(char)+1);
if(ktory < 0){
free(tmp);
printf("ERROR: Please enter number greater that 0.\n");
return "-1";
}
if(ktory == 0){
beg=memchr(beg,separator,strlen(*tekst));
if (beg == NULL){
free(tmp);
printf("ERROR: No delimiters in text.\n");
return "-1";
}
wynik = (char*)malloc(beg-(*tekst));
memset(wynik, '\0',beg-(*tekst)+1);
memcpy(wynik,*tekst,beg-(*tekst));
strcpy(*tekst,tmp);
free(tmp);
return wynik;
}
do{
beg=memchr(beg,separator,strlen(*tekst));
if (beg != NULL && ++licznik==ktory){
end=memchr(++beg,separator,strlen(beg));
if (end == NULL){
wynik = (char*)malloc(strlen(beg));
memset(wynik, '\0',strlen(beg)+1);
memcpy(wynik,beg,strlen(beg));
memmove(tmp,*tekst,beg-(*tekst));
strcpy(*tekst,tmp);
free(tmp);
return wynik;
}
wynik = (char*)malloc(end-beg);
memset(wynik, '\0',end-beg+1);
memcpy(wynik,beg,end-beg);
tmp = (char*)malloc(strlen(*tekst)*sizeof(char));
memset(tmp, '\0', strlen(*tekst)*sizeof(char)+1);
memmove(tmp,*tekst,beg-(*tekst));
memmove(tmp+(beg-(*tekst)),end,strlen(end)+1);
strcpy(*tekst,tmp);
free(tmp);
return wynik;
}
}while(beg++ != NULL);
if(licznik != ktory){
free(tmp);
printf("ERROR: Too few delimiters in text.\n");
return "-1";
}
}
Ale jakos mi to nie dziala jak w petli podaje jakis tekst i wywoluje ta funkcje :/ co mzoe byc zle albo mozna zrobic lepiej?