0Pricing
C Academy · Pelajaran

strtok dan Tokenisasi

Pisahkan string.

strtok dan Tokenisasi adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Apa itu tokenisasi?

Tokenisasi berarti memisahkan string menjadi bagian-bagian yang lebih kecil (token) yang dipisahkan oleh karakter pembatas.

Contohnya, memisahkan "a,b,c" berdasarkan koma menghasilkan token a, b, dan c. C menyediakan strtok untuk keperluan ini.

#include <stdio.h>
#include <string.h>

int main(void) {
    char text[] = "a,b,c";
    char *token = strtok(text, ",");
    printf("First token: %s\n", token);
    return 0;
}

Signatur strtok

char *strtok(char *str, const char *delim);

Pada pemanggilan pertama, Anda meneruskan string. Pada pemanggilan berikutnya, Anda meneruskan NULL agar proses dilanjutkan dari posisi sebelumnya. Fungsi ini mengembalikan token berikutnya, atau NULL jika sudah selesai.

#include <stdio.h>
#include <string.h>

int main(void) {
    char text[] = "red green blue";
    char *tok = strtok(text, " ");
    while (tok != NULL) {
        printf("%s\n", tok);
        tok = strtok(NULL, " ");
    }
    return 0;
}

strtok mengubah string

Penting: strtok mengubah string asli. Fungsi ini mengganti setiap pembatas dengan '\0' dan mengembalikan penunjuk ke buffer yang sama.

Artinya, Anda tidak dapat melakukan tokenisasi pada literal string seperti "a,b", karena literal tersebut hanya dapat dibaca.

#include <stdio.h>
#include <string.h>

int main(void) {
    char data[] = "x:y:z";
    strtok(data, ":");
    printf("data[1] is now: %d (the null byte)\n", data[1]);
    return 0;
}

Buat salinan yang dapat ditulis

Karena strtok merusak masukannya, salin string terlebih dahulu jika Anda masih memerlukan string asli nanti.

Gunakan array lokal char atau salin dengan strcpy ke dalam buffer.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *original = "one-two-three";
    char copy[64];
    strcpy(copy, original);
    char *tok = strtok(copy, "-");
    while (tok) {
        printf("%s\n", tok);
        tok = strtok(NULL, "-");
    }
    printf("Original intact: %s\n", original);
    return 0;
}

Beberapa pembatas

Argumen delim adalah sebuah kumpulan karakter, bukan urutan karakter. Setiap karakter dalam kumpulan tersebut berfungsi sebagai pemisah.

Jadi, " ,;" memisahkan berdasarkan spasi, koma, dan titik koma sekaligus.

#include <stdio.h>
#include <string.h>

int main(void) {
    char text[] = "a,b;c d";
    char *tok = strtok(text, ",; ");
    while (tok) {
        printf("[%s]\n", tok);
        tok = strtok(NULL, ",; ");
    }
    return 0;
}

Pembatas berurutan

strtok memperlakukan rangkaian pembatas sebagai satu pemisah dan melewati token kosong.

Jadi, "a,,b" hanya menghasilkan a dan b, bukan token kosong di antaranya. Ingat hal ini saat mengurai CSV karena kolom kosong bisa bermakna.

#include <stdio.h>
#include <string.h>

int main(void) {
    char text[] = "a,,b";
    char *tok = strtok(text, ",");
    while (tok) {
        printf("token: %s\n", tok);
        tok = strtok(NULL, ",");
    }
    return 0;
}

Menghitung token

Tugas yang umum adalah menghitung jumlah token dalam sebuah string. Tambahkan penghitung di dalam pengulangan.

#include <stdio.h>
#include <string.h>

int main(void) {
    char sentence[] = "the quick brown fox";
    int count = 0;
    char *tok = strtok(sentence, " ");
    while (tok) {
        count++;
        tok = strtok(NULL, " ");
    }
    printf("Word count: %d\n", count);
    return 0;
}

strtok menyimpan status tersembunyi

strtok menyimpan posisinya dalam variabel internal statis. Itulah sebabnya NULL melanjutkan string sebelumnya.

Kekurangannya: fungsi ini tidak dapat digunakan kembali secara aman dan tidak aman untuk thread. Anda tidak dapat melakukan tokenisasi pada dua string sekaligus.

#include <stdio.h>
#include <string.h>

int main(void) {
    char a[] = "1 2";
    char *t = strtok(a, " ");
    printf("%s\n", t);
    t = strtok(NULL, " ");
    printf("%s\n", t);
    return 0;
}

Menyimpan token

Untuk menggunakan token setelah pemisahan, simpan penunjuk yang dikembalikan dalam sebuah array. Penunjuk tersebut mengarah ke buffer sumber yang kini telah diubah, sehingga buffer itu harus tetap tersedia.

#include <stdio.h>
#include <string.h>

int main(void) {
    char csv[] = "name,age,city";
    char *fields[10];
    int n = 0;
    char *tok = strtok(csv, ",");
    while (tok && n < 10) {
        fields[n++] = tok;
        tok = strtok(NULL, ",");
    }
    for (int i = 0; i < n; i++)
        printf("Field %d: %s\n", i, fields[i]);
    return 0;
}

Alternatif yang dapat digunakan kembali

POSIX menyediakan strtok_r, yang menerima char **saveptr secara eksplisit, bukan status tersembunyi. Dengan demikian, fungsi ini aman digunakan secara bersarang dan lintas thread.

Untuk C standar yang portabel, strtok biasa sudah memadai untuk penguraian satu kali jalan.

#include <stdio.h>
#include <string.h>

int main(void) {
    char text[] = "p:q:r";
    char *save;
    char *tok = strtok_r(text, ":", &save);
    while (tok) {
        printf("%s\n", tok);
        tok = strtok_r(NULL, ":", &save);
    }
    return 0;
}

Praktik: memisahkan jalur

Tokenisasi sangat berguna saat mengurai teks terstruktur seperti jalur file. Memisahkan berdasarkan / akan menampilkan setiap komponen jalur.

#include <stdio.h>
#include <string.h>

int main(void) {
    char path[] = "usr/local/bin";
    char *part = strtok(path, "/");
    while (part) {
        printf("-> %s\n", part);
        part = strtok(NULL, "/");
    }
    return 0;
}

Pemeriksaan singkat

Uji pemahaman Anda tentang cara kerja strtok.

Rangkuman

Anda telah mempelajari cara memisahkan string dengan strtok:

  • Pemanggilan pertama menerima string; pemanggilan berikutnya menerima NULL.
  • Fungsi ini mengubah masukan dengan mengganti pembatas menjadi '\0' — salin string yang hanya dapat dibaca terlebih dahulu.
  • Argumen pembatas adalah sebuah kumpulan; pembatas yang berurutan digabungkan.
  • Fungsi ini menggunakan status statis dan tidak aman untuk thread; gunakan strtok_r jika diperlukan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “strtok dan Tokenisasi” gratis?

Ya — teks lengkap “strtok dan Tokenisasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “strtok dan Tokenisasi”?

Pisahkan string. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “strtok dan Tokenisasi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. strlen, strcpy, strcat
  2. strcmp dan Perbandingan
  3. strtok dan Tokenisasi
  4. memcpy dan memset
← Kembali ke C Academy