Wskaźnik do n-tego odseparowanego elementu stringa

0

Cześć!
Potrzebna mi funkcja, która zwraca wskaźnik do n-tego odseparowanego elementu w stringu. Coś tam wyskrobałam, ale nie wiem czy pod koniec nie powinnam reallocować pamięci na którą wskazuje wskaźnik d? bo był malloc na rozmiar całego stringa("cos=tam=elo") a potem przechowywany jest tam tylko kawałeczek("elo"), więc jest to trochę nieładnie?

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
/* pointer to n separated element of string */
char *nstrsep (const char *string, const char *sep, int npart) {
	char *token;
	char *d = malloc (strlen (string) + 1);
    if (d == NULL) return NULL;
    strcpy (d,string);
    token = strtok(d,sep);
    if (npart>0) {
    	int i;
    	for(i=0; i<npart; i++)
    		token = strtok(NULL,"=");
    }

    strcpy(d,token);
    return d;
}

int main(void) {

	char *part;
	part = nstrsep("cos=tam=elo","=",2);
	printf("%s\n",part);
	free(part);


	return 0;
}
1

Znacznie szybsze i lepsze będzie:

char *nstrsep (const char *string, const char *sep,unsigned npart)
  {
   unsigned len=strlen(sep);
   while(npart--)
     {
      string=strstr(string,sep);
      if(!string) return 0;
      string+=len;
     }
   sep=strstr(string,sep);
   len=(sep?sep-string:strlen(string))+1;
   char *ret=(char*)malloc(len);
   memcpy(ret,string,len);
   return ret;
  }

Poczytaj co robi ten strtok.

0

@_13th_Dragon Dziękuje, rzeczywiście. Tylko gdy ten ostatni argument "npart" wywołam np. 0 albo 1 (po prostu string ze środka), otrzymuję np: cos= albo tam=. Muszę doczytać dokładnie o tych wszystkich funkcjach/operatorach, których użyłeś, ale zmieniłam dwie linijki i działa teraz okey;

char *nstrsep2 (const char *string, const char *sep,unsigned npart) {
	unsigned len=strlen(sep);
	while(npart--) {
		string=strstr(string,sep);
		if(!string) return 0;
		string+=len;
	}
	sep=strstr(string,sep);
	len=(sep?sep-string:strlen(string));      /* tutaj bez +1 */
	char *ret=(char*)malloc(len+1);          /* tutaj z +1 */
	memcpy(ret,string,len);
	return ret;
}

Wszędzie przy alokowaniu stringów widzę to +1 na NULL, ale nie wiem czy trzeba to stosować ;/
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1