GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre strtok_r et strtok_s en C ?

strtok_s est simplement la version Windows de strtok_r qui est standard partout ailleurs.

Une façon (courante, je pense) de rendre un programme portable lorsqu'il s'agit de fonctions comme strtok_s /strtok_r est d'utiliser le préprocesseur :

#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif

Comme les prototypes et les fonctionnalités sont les mêmes, vous ne pouvez désormais utiliser que strtok_r .


Je n'ai pas assez de réputation pour commenter d'autres réponses, je vais donc devoir fournir la mienne.

1) Pour répondre à cette déclaration :

"strtok_s est une version de strtok sécurisée par débordement de tampon sous Windows. Le strtok standard sous Windows est thread-safe..."

Ce n'est pas vrai. strtok_s est la version thread-safe du compilateur MSVC. strtok n'est pas thread-safe !

2) Pour répondre à cette déclaration :

"Cela cassera probablement si on compile sur Cygwin qui se signale comme Windows mais a des interfaces POSIX comme strtok_r déjà défini."

Encore une fois, pas vrai. La différence est le compilateur que vous utilisez. Lors de l'utilisation du compilateur Visual C++ de Microsoft, MSVC, la fonction est strtok_s. Un autre compilateur, tel que GNU Compiler Collection, GCC, peut utiliser une implémentation de bibliothèque standard différente telle que strtok_r . Pensez au compilateur, pas à la plate-forme cible, lors de l'identification de la fonction à utiliser.

À mon avis, la réponse de Joachim Pileborg est la meilleure sur cette page. Cependant, il a besoin d'une petite modification :

#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif

_WIN32 et _WIN64 sont des macros prédéfinies fournies par le compilateur MSVC. _WIN64 est défini lors de la compilation d'une cible 64 bits. _WIN32 est défini pour les cibles 32 et 64 bits. Il s'agit d'un compromis que Microsoft a fait pour la rétrocompatibilité. _WIN32 a été créé pour spécifier l'API Win32. Maintenant, vous devez considérer _WIN32 pour spécifier l'API Windows - il n'est pas spécifique à une cible 32 bits.


Ces deux fonctions sont des idiomes vraiment laids et peu intuitifs pour l'analyse des chaînes, et ne répondent généralement pas aux exigences de votre application particulière de manière subtile. Encore plus pour le simple strtok en C standard. Jetez-les simplement et écrivez votre propre code pour itérer sur le char tableau et décomposez-le au besoin. strchr , strspn , et strcspn peut être utile pour ce faire ou vous pouvez simplement travailler à partir de zéro sur la baie.


Linux
  1. La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

  2. Quelle est la différence entre insmod et modprobe

  3. Quelle est la différence entre adduser et useradd ?

  4. Quelle est la différence entre ls et l ?

  5. Quelle est la différence entre $(CC) et $CC ?

Quelle est la différence entre Linux et Unix ?

Quelle est la différence entre la connexion et le shell sans connexion

Quelle est la différence entre la commande apt et apt-get ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre unlink et rm ?