strtok_s
è semplicemente la versione Windows di strtok_r
che è standard ovunque.
Un modo (credo comune) per rendere portatile un programma quando si tratta di funzioni come strtok_s
/strtok_r
è usare il preprocessore:
#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif
Poiché i prototipi e la funzionalità sono gli stessi, ora puoi usare solo strtok_r
.
Non ho abbastanza reputazione per commentare altre risposte, quindi dovrò fornire la mia.
1) Per rispondere a questa affermazione:
"strtok_s è una versione protetta da sovraccarico del buffer di strtok su Windows. Lo strtok standard su Windows è thread-safe..."
Questo non è vero. strtok_s è la versione thread-safe per il compilatore MSVC. strtok non è thread-safe!
2) Per rispondere a questa affermazione:
"Questo probabilmente non funzionerebbe se si compila su Cygwin che si segnala come Windows ma ha interfacce POSIX come
strtok_r
già definito."
Di nuovo, non è vero. La differenza è quale compilatore usi. Quando si utilizza il compilatore Microsoft Visual C++, MSVC, la funzione è strtok_s.
Un altro compilatore, come la GNU Compiler Collection, GCC, può utilizzare un'implementazione di libreria standard diversa come strtok_r
. Pensa al compilatore, non alla piattaforma di destinazione, quando identifichi quale funzione utilizzare.
A mio parere, la risposta di Joachim Pileborg è la migliore in questa pagina. Tuttavia, necessita di una piccola modifica:
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
Sia _WIN32 che _WIN64 sono macro predefinite fornite dal compilatore MSVC. _WIN64 viene definito durante la compilazione di un target a 64 bit. _WIN32 è definito per entrambe le destinazioni a 32 e 64 bit. Questo è un compromesso che Microsoft ha fatto per la retrocompatibilità. _WIN32 è stato creato per specificare l'API Win32. Ora dovresti considerare _WIN32 per specificare l'API di Windows:non è specifico per un target a 32 bit.
Entrambe queste funzioni sono idiomi davvero brutti e non intuitivi per l'analisi delle stringhe e di solito non riescono a soddisfare i requisiti della tua particolare applicazione in modi sottili. Ancora di più per il semplice strtok
nello standard C. Buttali via e scrivi il tuo codice per ripetere il char
array e suddividerlo secondo necessità. strchr
, strspn
e strcspn
può essere utile per fare questo o puoi semplicemente lavorare da zero sull'array.