Domanda

Ho sviluppato la mia versione di strtok. Basta mettere in pratica l'uso di puntatori.

Qualcuno può vedere eventuali limitazioni con questo o qualche cosa che posso migliorare.

void stvstrtok(const char *source, char *dest, const char token) 
{
    /* Search for the token. */
    int i = 0;
    while(*source)
    {
        *dest++ = *source++;
        if(*source == token)
        {
            source++;
        }
    }
    *dest++ = '\0';
    }

int main(void)
{
    char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
    char buffer[sizeof(long_name)/sizeof(*long_name)];

    stvstrtok(long_name, buffer, ',');

    printf("buffer: %s\n", buffer);

   getchar();

   return 0;
}
È stato utile?

Soluzione

Una nota a margine: La parola 'token' è di solito utilizzato per descrivere le parti della stringa che vengono restituiti. Delimitatore è usato per descrivere la cosa che separa i gettoni. Quindi, per rendere il codice più chiaro si dovrebbe rinominare token per delimitatore e rinominare dest a token_dest.

Le differenze di vostra funzione e strtok:

Ci sono molte differenze tra la vostra funzione e strtok.

  • Che la vostra funzione non è sufficiente rimuovere i separatori di token
  • Si chiama solo la funzione una volta per elaborare tutte le parti della stringa. Con strtok si chiama più volte per ogni parte della stringa (tempi successivi con NULL come il primo param).
  • strtok distrugge anche la stringa di origine, mentre il codice utilizza un proprio buffer (penso che meglio di utilizzare il proprio buffer come avete fatto).
  • negozi strtok la posizione del token successivo dopo ogni chiamata in cui il primo parametro è NULL. Questa posizione viene quindi utilizzato per le chiamate successive. Questo non è thread-safe e anche se la funzione sarebbe thread-safe.
  • strtok può utilizzare più delimitatori diversi, mentre il codice utilizza solo uno.

Detto questo, io darò suggerimenti su come fare una migliore funzione, non una funzione che è più vicino alla realizzazione di strtok.

Come migliorare la funzione (non emulare strtok):

Credo che sarebbe meglio apportare le seguenti modifiche:

  • Avere la funzione semplicemente restituire il token 'successivo'
  • Break out del ciclo quando si dispone * origine o fonte del * == delimitatore
  • Restituire un puntatore al primo carattere della stringa di origine che contiene il token successivo. Questo puntatore può essere utilizzato per le chiamate successive.

Altri suggerimenti

Questo codice non funziona affatto come strtok(). Cosa stavi cercando di fare, esattamente? Ma per quanto riguarda i miglioramenti, il codice ha un grave bug: se la lunghezza del source sottratto per il numero di occorrenze di token è maggiore della lunghezza di dest avete voi stessi un classicissimo stack overflow , che sembra un po 'ironico per me in questo momento. Questo non accadrà nel main che hai utilizzato, ma utilizzando la funzione altrove non può non portare voi nel percorso di incertezza e pantano della disperazione.

strtok consente di scorrere tutti i gettoni. A tale scopo, assumendo che la stringa sorgente è scrivibile e inserire i null in esso durante le pause di token. Il buffer di destinazione è un puntatore all'offset withing buffer sorgente carattere. È possibile utilizzare questo fatto per sapere quando si è raggiunta la fine + anche a mantenere "stato" tra le chiamate.

strtok non è una buona funzione da utilizzare, in quanto distrugge la stringa di origine. Inoltre non è rientrante.

strtok () farà risparmiare qualche stato, quindi si può chiamare più volte per ottenere più gettoni. Inoltre, strtok () sarà "split" la stringa di origine in modo da ottenere più stringhe di destinazione, ognuno dei quali è un token.

Tutto il codice fa, da quello che vedo, è ignorare qualsiasi carattere di input che eguaglia il separatore token e continuare a copiare alla terminazione null della sorgente.

modifica: Inoltre, ritengono che vi sono due sequenziamento token-separatori: La prima sarà ignorato dalla vostra funzione, il secondo sarà scritto alla destinazione, mentre strtok () definirà un seqeunce di 2 o più delimitatori come un unico delimitatore (man page: http://man.cx/?page=strtok )

strtok distrugge la stringa di input con il carattere nullo, che rende tipo di ostile.

È necessario considerare anche il caso di "xyz ,, pdq" quanti gettoni saranno strtok tirare fuori di tale stringa se '' è il delimitatore.

Cosa vuoi la funzione di fare in questo caso?

Inoltre, strtok (...) supporta più caratteri di delimitazione. Guardare negli definizioni di strspn (...) e strcspn (...), in quanto possono essere utilizzati per re-implementare strtok (...).

Tra l'altro, è long_name puntatore a char e sizeof (long_name) è sizeof (char *). non la dimensione di ciò che i punti long_name a.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top