127 votes

Comment strtok() divise-t-il la chaîne de caractères en tokens en C ?

Veuillez m'expliquer le fonctionnement de strtok() fonction. Le manuel indique qu'elle décompose la chaîne de caractères en jetons. Je ne parviens pas à comprendre ce qu'elle fait réellement.

J'ai ajouté des montres sur str et *pch pour vérifier son fonctionnement lors de la première boucle while, le contenu du fichier str étaient seulement "ceci". Comment la sortie montrée ci-dessous s'est-elle imprimée à l'écran ?

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Sortie :

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

0voto

Abhishek Mane Points 171

strtok remplace le délimiteur par '\0' Caractère NULL dans la chaîne de caractères donnée

CODE

#include<iostream>
#include<cstring>

int main()
{
    char s[]="30/4/2021";     
    std::cout<<(void*)s<<"\n";    // 0x70fdf0

    char *p1=(char*)0x70fdf0;
    std::cout<<p1<<"\n";

    char *p2=strtok(s,"/");
    std::cout<<(void*)p2<<"\n";
    std::cout<<p2<<"\n";

    char *p3=(char*)0x70fdf0;
    std::cout<<p3<<"\n";

    for(int i=0;i<=9;i++)
    {
        std::cout<<*p1;
        p1++;
    }

}

SORTIE

0x70fdf0       // 1. address of string s
30/4/2021      // 2. print string s through ptr p1 
0x70fdf0       // 3. this address is return by strtok to ptr p2
30             // 4. print string which pointed by p2
30             // 5. again assign address of string s to ptr p3 try to print string
30 4/2021      // 6. print characters of string s one by one using loop

Avant de tokeniser la chaîne de caractères

J'ai assigné l'adresse de la chaîne s à un certain ptr(p1) et j'ai essayé d'imprimer la chaîne par ce ptr et la chaîne entière est imprimée.

après avoir été tokenisé

strtok renvoie l'adresse de la chaine s à ptr(p2) mais quand j'essaie d'imprimer la chaine par ptr il n'imprime que "30" il n'imprime pas la chaine entière. donc c'est sûr que strtok is not just returning adress but it is placing '\0' character where delimiter is present .

contrôle croisé

1.

de nouveau, j'assigne l'adresse de la chaîne s à un certain ptr (p3) et j'essaie d'imprimer la chaîne, elle imprime "30" car pendant la tokénisation, la chaîne est mise à jour avec '. \0 ' au niveau du délimiteur.

2.

voir l'impression de la chaîne s caractère par caractère via la boucle le 1er délimiteur est remplacé par ' \0 ' afin d'imprimer un espace vide plutôt que ''.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X