GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è la differenza tra strtok_r e strtok_s in C?

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.


Linux
  1. Qual è la differenza tra Redhat e centOS?

  2. Qual è la differenza tra insmod e modprobe

  3. Qual è la differenza tra thread NPTL e POSIX?

  4. Qual è la differenza tra adduser e useradd?

  5. Qual è la differenza tra ls e l?

Qual è la differenza tra Linux e Unix?

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra $(CC) e $CC?