GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es la diferencia entre strtok_r y strtok_s en C?

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.


Linux
  1. ¿Cuál es la diferencia entre Redhat y centOS?

  2. ¿Cuál es la diferencia entre mutex y sección crítica?

  3. ¿Cuál es la diferencia entre adduser y useradd?

  4. ¿Cuál es la diferencia entre `su -` y `su --login`?

  5. ¿Cuál es la diferencia entre unlink y rm?

¿Cuál es la diferencia entre Linux y Unix?

¿Cuál es la diferencia entre Shell de inicio de sesión y sin inicio de sesión?

¿Cuál es la diferencia entre el comando apt y apt-get?

¿Qué es un Hipervisor? ¿Cuál es la diferencia entre el tipo 1 y 2?

¿Cuál es la diferencia entre curl y Wget?

¿Cuál es la diferencia entre $(CC) y $CC?