strtok_s
es simplemente la versión de Windows de strtok_r
que es estándar en todas partes.
Una forma (creo que común) de hacer que un programa sea portátil cuando se trata de funciones como strtok_s
/strtok_r
es usar el preprocesador:
#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif
Como los prototipos y la funcionalidad son los mismos, ahora solo puede usar strtok_r
.
No tengo suficiente reputación para comentar otras respuestas, así que tendré que proporcionar la mía.
1) Para abordar esta declaración:
"strtok_s es una versión segura de saturación de búfer de strtok en Windows. El strtok estándar en Windows es seguro para subprocesos..."
Esto no es verdad. strtok_s es la versión segura para subprocesos del compilador MSVC. ¡strtok no es seguro para subprocesos!
2) Para abordar esta declaración:
"Esto probablemente fallaría si se compila en Cygwin, que se informa a sí mismo como Windows pero tiene interfaces POSIX como strtok_r
ya definido."
De nuevo, no es cierto. La diferencia es qué compilador usas. Cuando se usa el compilador Visual C++ de Microsoft, MSVC, la función es strtok_s.
Otro compilador, como GNU Compiler Collection, GCC, puede usar una implementación de biblioteca estándar diferente, como strtok_r
. Piense en el compilador, no en la plataforma de destino, cuando identifique qué función usar.
En mi opinión, la respuesta de Joachim Pileborg es la mejor de esta página. Sin embargo, necesita una pequeña edición:
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
Tanto _WIN32 como _WIN64 son macros predefinidas proporcionadas por el compilador de MSVC. _WIN64 se define al compilar un objetivo de 64 bits. _WIN32 está definido para destinos de 32 y 64 bits. Este es un compromiso que Microsoft hizo para la compatibilidad con versiones anteriores. _WIN32 se creó para especificar la API de Win32. Ahora debe considerar _WIN32 para especificar la API de Windows; no es específico para un objetivo de 32 bits.
Ambas funciones son modismos realmente desagradables y poco intuitivos para analizar cadenas y, por lo general, no cumplen con los requisitos de su aplicación particular de manera sutil. Más aún para el simple strtok
en C estándar. Simplemente deséchelos y escriba su propio código para iterar sobre el char
array y divídalo según sea necesario. strchr
, strspn
y strcspn
puede ser útil para hacer esto o simplemente puede trabajar desde cero en la matriz.