strtok_s
hanyalah versi Windows dari strtok_r
yang standar di tempat lain.
Satu (menurut saya umum) cara untuk membuat program portabel ketika datang ke fungsi seperti strtok_s
/strtok_r
adalah dengan menggunakan preprocessor:
#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif
Karena prototipe dan fungsionalitasnya sama, kini Anda hanya dapat menggunakan strtok_r
.
Saya tidak memiliki reputasi yang cukup untuk mengomentari jawaban lain, jadi saya harus memberikan jawaban saya sendiri.
1) Untuk mengatasi pernyataan ini:
"strtok_s adalah versi aman buffer overrun dari strtok di Windows. Standar strtok di windows aman untuk thread..."
Ini tidak benar. strtok_s adalah versi thread safe untuk kompiler MSVC. strtok tidak aman untuk thread!
2) Untuk mengatasi pernyataan ini:
"Ini mungkin akan rusak jika dikompilasi pada Cygwin yang melaporkan dirinya sendiri sebagai windows tetapi memiliki antarmuka POSIX seperti
strtok_r
sudah ditentukan."
Sekali lagi, tidak benar. Perbedaannya adalah kompiler mana yang Anda gunakan. Saat menggunakan kompiler Visual C++ Microsoft, MSVC, fungsinya adalah strtok_s.
Compiler lain, seperti GNU Compiler Collection, GCC, mungkin menggunakan implementasi library standar yang berbeda seperti strtok_r
. Pikirkan kompiler, bukan platform target, saat mengidentifikasi fungsi mana yang akan digunakan.
Menurut saya, jawaban Joachim Pileborg adalah yang terbaik di halaman ini. Namun, perlu sedikit edit:
#if defined(_WIN32) /* || defined(_WIN64) */
#define strtok_r strtok_s
#endif
Baik _WIN32 dan _WIN64 adalah makro standar yang disediakan oleh kompiler MSVC. _WIN64 ditentukan saat mengkompilasi target 64 bit. _WIN32 ditentukan untuk target 32 dan 64 bit. Ini adalah kompromi yang dibuat Microsoft untuk kompatibilitas mundur. _WIN32 dibuat untuk menentukan API Win32. Sekarang Anda harus mempertimbangkan _WIN32 untuk menentukan API Windows -- ini tidak khusus untuk target 32 bit.
Kedua fungsi ini benar-benar jelek, idiom yang tidak intuitif untuk penguraian string, dan biasanya gagal memenuhi persyaratan aplikasi khusus Anda dengan cara yang tidak kentara. Terlebih lagi untuk strtok
biasa dalam standar C. Buang saja dan tulis kode Anda sendiri untuk mengulangi char
array dan memecahnya sesuai kebutuhan. strchr
, strspn
, dan strcspn
dapat membantu dalam melakukan ini atau Anda dapat bekerja dari awal pada larik.