GNU/Linux >> Belajar Linux >  >> Linux

Apa perbedaan antara strtok_r dan strtok_s di C?

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.


Linux
  1. Apa perbedaan antara Redhat dan centOS?

  2. Apa perbedaan antara insmod dan modprobe

  3. Apa perbedaan antara mutex dan bagian kritis?

  1. Apa perbedaan antara utas NPTL dan POSIX?

  2. Apa perbedaan antara adduser dan useradd?

  3. Apa perbedaan antara `su -` dan` su --login`?

  1. Apa perbedaan antara $(CC) dan $CC?

  2. Apa perbedaan antara unlink dan rm?

  3. Apa perbedaan antara rute dan rute ip?