Tolong jelaskan kepada saya cara kerja strtok()
fungsinya. Manual mengatakan itu memecah string menjadi token. Saya tidak dapat memahami dari manual apa yang sebenarnya dilakukannya.
Saya menambahkan jam tangan str
dan *pch
memeriksa kerjanya ketika loop sementara pertama terjadi, isinya str
hanya "ini". Bagaimana keluaran yang ditunjukkan di bawah ini tercetak di layar?
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
Keluaran:
Memisahkan string "- Ini, string sampel." menjadi token: Ini Sebuah Sampel tali
strtok()
mengubah string argumennya dengan menghentikan token dengan NUL sebelum kembali. Jika Anda mencoba untuk memeriksa seluruh buffer (str []) Anda akan melihatnya diubah antara panggilan yang berurutan kestrtok()
.str
, menontonstr[0]
,str[1]
,str[2]
, ...Jawaban:
strtok()
membagi string menjadi token. yaitu mulai dari salah satu pembatas ke pembatas berikutnya akan menjadi satu token Anda. Dalam kasus Anda, token awal adalah dari "-" dan diakhiri dengan spasi "". Kemudian token berikutnya akan dimulai dari "" dan diakhiri dengan ",". Di sini Anda mendapatkan "Ini" sebagai output. Demikian pula, sisa string dipecah menjadi token dari ruang ke ruang dan akhirnya mengakhiri token terakhir pada "."sumber
fungsi runtime strtok bekerja seperti ini
pertama kali Anda memanggil strtok, Anda memberikan string yang ingin Anda tokenize
di ruang string di atas tampaknya menjadi pembatas yang baik antara kata-kata jadi mari kita gunakan itu:
apa yang terjadi sekarang adalah bahwa 's' dicari sampai karakter spasi ditemukan, token pertama dikembalikan ('ini') dan p menunjuk ke token itu (string)
untuk mendapatkan token berikutnya dan melanjutkan dengan string yang sama NULL dilewatkan sebagai argumen pertama karena strtok mempertahankan pointer statis ke string yang Anda lewati sebelumnya:
p sekarang menunjuk ke 'adalah'
dan seterusnya sampai tidak ada lagi spasi yang ditemukan, maka string terakhir dikembalikan sebagai 'string' token terakhir.
lebih mudahnya Anda bisa menulisnya seperti ini daripada mencetak semua token:
EDIT:
Jika Anda ingin menyimpan nilai yang dikembalikan dari
strtok
Anda perlu menyalin token ke buffer lain misalnyastrdup(p);
karena string asli (yang ditunjukkan oleh pointer statis di dalamnyastrtok
) dimodifikasi di antara iterasi untuk mengembalikan token.sumber
p
menunjuk ke token itu" , adalahstrtok
kebutuhan untuk mengubah string asli dengan menempatkan karakter nol sebagai pengganti pemisah (jika tidak, fungsi string lain tidak akan tahu di mana token berakhir). Dan itu juga melacak keadaan menggunakan variabel statis.strtok
memelihara referensi internal statis yang menunjuk ke token yang tersedia berikutnya dalam string; jika Anda memberikan pointer NULL, itu akan bekerja dari referensi internal itu.Inilah alasannya
strtok
bukan peserta kembali; segera setelah Anda memberikan pointer baru, referensi internal lama tersebut akan terhalang.sumber
strtok
tidak mengubah parameter itu sendiri (str
). Ini menyimpan pointer itu (dalam variabel statis lokal). Hal ini kemudian dapat mengubah apa yang parameter poin ke dalam panggilan berikutnya tanpa parameter berlalu kembali. (Dan itu dapat memajukan penunjuk yang telah disimpannya bagaimanapun ia perlu melakukan operasinya.)Dari
strtok
halaman POSIX :Ada varian aman utas (
strtok_r
) yang tidak melakukan sihir jenis ini.sumber
ctime
mengembalikan string statis - praktis (tidak ada yang perlu bertanya-tanya siapa yang harus membebaskannya), tetapi tidak memasukkan kembali dan membuat Anda tersandung jika Anda tidak terlalu menyadarinya.strtok
tidak mengubah parameter itu sendiri (str
)."puts(str);
mencetak "- Ini" sejakstrtok
diubahstr
.Pertama kali Anda memanggilnya, Anda memberikan string untuk dijadikan token
strtok
. Dan kemudian, untuk mendapatkan token berikut, Anda cukup memberikanNULL
fungsi itu, asalkan mengembalikan nonNULL
pointer.The
strtok
Fungsi mencatat string Anda pertama kali diberikan saat Anda menyebutnya. (Yang sangat berbahaya untuk aplikasi multi-utas)sumber
strtok akan memberi tokenize string yaitu mengubahnya menjadi serangkaian substring.
Itu dilakukan dengan mencari pembatas yang memisahkan token (atau substring) ini. Dan Anda menentukan pembatas. Dalam kasus Anda, Anda menginginkan '' atau ',' atau '.' atau '-' sebagai pembatas.
Model pemrograman untuk mengekstrak token ini adalah Anda menggunakan string utama dan set pembatas. Kemudian Anda memanggilnya berulang kali, dan setiap kali strtok akan mengembalikan token berikutnya yang ditemukannya. Sampai mencapai akhir string utama, ketika mengembalikan null. Aturan lainnya adalah Anda melewatkan string hanya untuk pertama kalinya, dan NULL untuk waktu berikutnya. Ini adalah cara untuk memberi tahu strtok jika Anda memulai sesi baru tokenizing dengan string baru, atau Anda mengambil token dari sesi tokenizing sebelumnya. Perhatikan bahwa strtok mengingat statusnya untuk sesi tokenisasi. Dan karena alasan ini, ini bukan reentrant atau thread safe (Anda harus menggunakan strtok_r sebagai gantinya). Hal lain yang perlu diketahui adalah itu benar-benar memodifikasi string asli. Ia menulis '\ 0' untuk pembatas yang ditemukannya.
Salah satu cara untuk memanggil strtok secara ringkas adalah sebagai berikut:
Hasil:
sumber
strtok memodifikasi string inputnya. Ini menempatkan karakter nol ('\ 0') di dalamnya sehingga akan mengembalikan bit dari string asli sebagai token. Faktanya strtok tidak mengalokasikan memori. Anda dapat memahaminya dengan lebih baik jika Anda menggambar tali sebagai urutan kotak.
sumber
Untuk memahami cara
strtok()
kerjanya, pertama-tama perlu diketahui apa itu variabel statis . Tautan ini menjelaskannya dengan cukup baik ....Kunci pengoperasiannya
strtok()
adalah mempertahankan lokasi pemisah terakhir antara panggilan seccessive (itulah sebabnyastrtok()
terus mengurai string asli yang diteruskan ke sana ketika dipanggil dengannull pointer
panggilan berturut-turut) ..Lihat
strtok()
implementasi saya sendiri , yang disebutzStrtok()
, yang memiliki fungsi agak berbeda dari yang disediakan olehstrtok()
Dan berikut adalah contoh penggunaan
Kode ini berasal dari pustaka pemrosesan string yang saya simpan di Github , yang disebut zString. Lihat kodenya, atau bahkan berkontribusi :) https://github.com/fnoyanisi/zString
sumber
Ini adalah bagaimana saya mengimplementasikan strtok, Tidak terlalu bagus tetapi setelah bekerja 2 jam akhirnya berhasil. Ini mendukung banyak pembatas.
sumber
strtok menggantikan karakter dalam argumen kedua dengan karakter NULL dan karakter NULL juga merupakan akhir dari string.
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
sumber
Berikut adalah implementasi saya yang menggunakan tabel hash untuk pembatas, yang berarti O (n), bukan O (n ^ 2) (berikut adalah tautan ke kode) :
sumber
strtok () menyimpan pointer dalam variabel statis di mana Anda terakhir kali tinggalkan, jadi pada panggilan ke-2, ketika kita meneruskan null, strtok () mendapatkan pointer dari variabel statis.
Jika Anda memberikan nama string yang sama, itu dimulai lagi dari awal.
Terlebih lagi strtok () bersifat merusak yaitu membuat perubahan pada string orignal. jadi pastikan Anda selalu memiliki salinan orignal.
Satu lagi masalah menggunakan strtok () adalah karena ia menyimpan alamat dalam variabel statis, dalam pemrograman multithread, memanggil strtok () lebih dari sekali akan menyebabkan kesalahan. Untuk penggunaan ini strtok_r ().
sumber
Bagi mereka yang masih kesulitan memahami
strtok()
fungsi ini , lihat contoh pythontutor ini , ini adalah alat yang hebat untuk memvisualisasikan kode C (atau C ++, Python ...) Anda.Jika tautan rusak, tempelkan:
Penghargaan diberikan kepada Anders K.
sumber
Anda dapat memindai array karakter untuk mencari token jika Anda menemukannya hanya mencetak baris baru, jika tidak, cetak karakter tersebut.
sumber
Jadi, ini adalah cuplikan kode untuk membantu lebih memahami topik ini.
Mencetak Token
Tugas: Diberikan sebuah kalimat, s, cetak setiap kata dari kalimat tersebut di baris baru.
Memasukkan:
How is that
Hasil:
Penjelasan: Jadi di sini, fungsi "strtok ()" digunakan dan diiterasi menggunakan for loop untuk mencetak token dalam baris terpisah.
Fungsi tersebut akan mengambil parameter sebagai 'string' dan 'break-point' dan memutuskan string pada break-point tersebut dan membentuk token. Sekarang, token tersebut disimpan dalam 'p' dan digunakan lebih lanjut untuk pencetakan.
sumber