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.