GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der Unterschied zwischen strtok_r und strtok_s in C?

strtok_s ist einfach die Windows-Version von strtok_r was sonst überall Standard ist.

Eine (ich denke, übliche) Möglichkeit, ein Programm portabel zu machen, wenn es um Funktionen wie strtok_s geht /strtok_r ist, den Präprozessor zu verwenden:

#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif

Da die Prototypen und Funktionen gleich sind, können Sie jetzt nur noch strtok_r verwenden .


Ich habe nicht genug Ruf, um andere Antworten zu kommentieren, also muss ich meine eigenen geben.

1) Um diese Aussage zu adressieren:

"strtok_s ist eine pufferüberlaufsichere Version von strtok unter Windows. Die Standard-strtok unter Windows ist Thread-sicher..."

Das ist nicht wahr. strtok_s ist die threadsichere Version für den MSVC-Compiler. strtok ist nicht threadsicher!

2) Um diese Aussage zu adressieren:

"Dies würde wahrscheinlich brechen, wenn Sie auf Cygwin kompilieren, das sich selbst als Windows meldet, aber POSIX-Schnittstellen wie strtok_r hat bereits definiert."

Wieder nicht wahr. Der Unterschied besteht darin, welchen Compiler Sie verwenden. Bei Verwendung des Visual C++-Compilers von Microsoft, MSVC, ist die Funktion strtok_s. Ein anderer Compiler, wie beispielsweise die GNU Compiler Collection, GCC, kann eine andere Standardbibliotheksimplementierung verwenden, wie beispielsweise strtok_r . Denken Sie an den Compiler, nicht an die Zielplattform, wenn Sie die zu verwendende Funktion identifizieren.

Meiner Meinung nach ist die Antwort von Joachim Pileborg die beste auf dieser Seite. Es bedarf jedoch einer kleinen Bearbeitung:

#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif

Sowohl _WIN32 als auch _WIN64 sind vordefinierte Makros, die vom MSVC-Compiler bereitgestellt werden. _WIN64 wird beim Kompilieren eines 64-Bit-Ziels definiert. _WIN32 ist sowohl für 32- als auch für 64-Bit-Ziele definiert. Dies ist ein Kompromiss, den Microsoft aus Gründen der Abwärtskompatibilität eingegangen ist. _WIN32 wurde erstellt, um die Win32-API anzugeben. Jetzt sollten Sie _WIN32 in Betracht ziehen, um die Windows-API anzugeben – es ist nicht spezifisch für ein 32-Bit-Ziel.


Diese beiden Funktionen sind wirklich hässliche, nicht intuitive Redewendungen zum Analysieren von Zeichenfolgen und erfüllen normalerweise die Anforderungen Ihrer speziellen Anwendung auf subtile Weise nicht. Noch mehr für den einfachen strtok in Standard-C. Werfen Sie sie einfach weg und schreiben Sie Ihren eigenen Code, um über char zu iterieren Array und brechen Sie es nach Bedarf auf. strchr , strspn , und strcspn kann dabei hilfreich sein, oder Sie können das Array einfach von Grund auf neu bearbeiten.


Linux
  1. Was ist der Unterschied zwischen InnoDB und MyISAM?

  2. Was ist der Unterschied zwischen Mutex und kritischem Abschnitt?

  3. Was ist der Unterschied zwischen fsck und e2fsck?

  4. Was ist der Unterschied zwischen adduser und useradd?

  5. Was ist der Unterschied zwischen ls und l?

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?

Was ist der Unterschied zwischen Route und IP-Route?