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.