Quelle est la différence entre strtok et strtok_r en C?
Quelle est la différence entre strtok et strtok_r en C et quand sommes-nous censés utiliser qui?
source d'informationauteur dreamer_999
Vous devez vous connecter pour publier un commentaire.
Quelle est la différence entre strtok et strtok_r en C et quand sommes-nous censés utiliser qui?
source d'informationauteur dreamer_999
Vous devez vous connecter pour publier un commentaire.
strtok
est équivalent à (et souvent défini comme l'):en général, vous devez utiliser
strtok_r
directement plutôt que destrtok
sauf si vous avez besoin pour rendre votre code portable à pré-POSIX-2001 les systèmes qui prennent en charge uniquementstrtok
La
_r
versions de fonctions réentrantes: vous pouvez appeler à partir de plusieurs threads simultanément, ou dans les boucles imbriquées, et cetera. Réentrant versions prennent généralement un argument supplémentaire, cet argument est utilisé pour stocker l'état entre les appels au lieu d'utiliser une variable globale.Non réentrant versions utilisent souvent l'état global, donc, si vous appelez à partir de plusieurs threads, vous êtes probablement en invoquant un comportement indéfini. Votre programme peut se bloquer, ou pire.
De l'homme pages (
man 3 strtok
):strtok
enregistrer statique pointeur pour réutiliser la prochaine fois, quand vous donnez la valeur NULL comme premier paramètre, donc, vous ne pouvez pas analyser les 2 chaînes en parallèle.Dans le
strtok_r
vous donner aussi le pointeur, en tant que paramètre de sortie (pointeur de pointeur). donc il n'est pas statique pointeur dans la fonction et vous pouvez passer d'une chaîne à l'autre et à l'arrière...Selon la documentation, la strtok_r() la fonction est une version réentrante de strtok().
Il obtient le prochain jeton de string s1, où les jetons sont des chaînes de caractères séparées par des caractères de s2. Pour obtenir le premier jeton à partir de s1, strtok_r() est appelée avec s1 comme premier paramètre. Autres jetons de s1 sont obtenues en appelant strtok_r() avec un pointeur null pour le premier paramètre. La chaîne de délimiteurs, s2, peut varier d'un appel à l'.