Question

J'ai développé ma propre version de strtok. Il suffit de mettre en pratique l'utilisation de pointeurs.

Quelqu'un peut-il voir les limites avec ceci ou de toute façon je peux améliorer.

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;
}
Était-ce utile?

La solution

Une note de côté: Le mot « jeton » est généralement utilisé pour décrire les parties de la chaîne qui sont retournés. Delimiter est utilisé pour décrire la chose qui sépare les jetons. Donc, pour rendre votre code plus clair, vous devez renommer jeton délimiteur et renommer dest à token_dest.

Les différences dans votre fonction et strtok:

Il existe plusieurs différences entre votre fonction et strtok.

  • Qu'est-ce que votre fonction n'est simplement supprimer les séparateurs de jeton
  • Vous appelez seulement votre fonction une fois pour traiter toutes les parties de la chaîne. Avec strtok vous l'appelez à plusieurs reprises pour chaque partie de la chaîne (les fois suivantes avec NULL comme premier PARAM).
  • strtok détruit aussi la chaîne source, alors que votre code utilise son propre tampon (je pense mieux utiliser votre propre tampon comme vous l'avez).
  • strtok mémorise la position du prochain jeton après chaque appel où le premier paramètre est NULL. Cette position est ensuite utilisée pour les appels suivants. C'est pas thread-safe si et votre fonction serait thread-safe.
  • strtok peut utiliser plusieurs délimiteurs différents, alors que votre code utilise un seul.

Cela étant dit, je vais donner des suggestions sur la façon de faire une meilleure fonction, et non une fonction qui est plus proche de la mise en œuvre de strtok.

Comment améliorer votre fonction (pas imiter strtok):

Je pense qu'il serait préférable de faire les modifications suivantes:

  • Demandez à votre fonction retourne simplement le jeton « suivant »
  • Sortez de la boucle quand vous avez la source * ou * Source == delimiter
  • Retourne un pointeur sur le premier caractère de votre chaîne source qui contient le jeton suivant. Ce pointeur peut être utilisé pour les appels suivants.

Autres conseils

Ce code ne fonctionne pas du tout comme strtok(). Qu'est-ce que vous essayez de faire, exactement? Mais pour autant que des améliorations, votre code a un bug grave: si la longueur de soustraites par le source nombre d'occurrences de est supérieure à token la longueur que vous avez vous dest obtenu un très classique débordement de pile , ce qui me semble un peu ironique pour le moment. Cela ne se produira pas dans le que vous avez main utilisé, mais en utilisant la fonction est liée à vous conduire ailleurs dans la voie de l'incertitude et le bourbier du désespoir.

strtok vous permet de parcourir à travers tous les jetons. Elle le fait en supposant que la chaîne source est accessible en écriture et en insérant dans ce nulls à des pauses symboliques. Le tampon de destination est un pointeur sur le caractère de décalage sont acceptés dans le tampon de source. Vous pouvez utiliser ce fait pour savoir quand vous avez atteint le + final aussi garder « l'état » entre les appels.

strtok n'est pas une bonne fonction à utiliser, car il détruit la chaîne source. Il est pas non plus rentrante.

strtok () sauvera un état, de sorte que vous pouvez l'appeler plusieurs fois pour obtenir plusieurs jetons. En outre, strtok () sera « split » la chaîne source de sorte que vous obtenez plusieurs chaînes de destination, chacun étant un jeton.

Tout code fait, de ce que je vois, est ignorer tout char entrée qui correspond à la seperator jeton, et continuer la copie sur le caractère nul de terminaison de la source.

edit: De plus, considèrent qu'il ya deux jetons-seperators de séquençage: La première est ignorée par votre fonction, le second sera écrit à la destination, alors que strtok () définira un seqeunce de 2 ou plus délimiteurs comme une seule delimiter (page man: http://man.cx/?page=strtok )

strtok détruit la chaîne d'entrée avec le caractère NUL, ce qui en fait genre d'hostile.

Vous devez considérer aussi le cas de « xyz ,, PDQ » combien de jetons vont strtok retirer de cette chaîne si « » est le delimiter.

Qu'est-ce que vous voulez que votre fonction faire dans ce cas?

En outre, strtok (...) prend en charge les caractères délimiteurs multiples. Regardez dans les définitions de strspn (...) et strcspn (...), car ils peuvent être utilisés pour réimplémenter strtok (...).

Par ailleurs, LONG_NAME est pointeur vers un char et sizeof (LONG_NAME) est sizeof (char *). pas la taille de ce que les points de LONG_NAME à.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top