0Pricing
C Academy · Pelajaran

Contoh Praktis

Fungsi logging.

Contoh Praktis adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Fungsi pencatatan

Pencatat adalah penggunaan variadik di dunia nyata yang sangat tepat. Kita ingin memanggil log_msg("user %s scored %d", name, score) seperti printf.

Pelajaran ini membuat utilitas pencatatan kecil yang bermanfaat.

#include <stdio.h>
#include <stdarg.h>

void log_msg(const char *fmt, ...) {
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

int main(void) {
    log_msg("user %s scored %d", "Ann", 90);
    return 0;
}

Menambahkan tingkat keparahan

Pencatat nyata memberi label pada pesan dengan tingkat seperti INFO atau ERROR. Tambahkan parameter tetap sebelum string format untuk tingkat tersebut.

#include <stdio.h>
#include <stdarg.h>

void logf(const char *level, const char *fmt, ...) {
    printf("[%s] ", level);
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

int main(void) {
    logf("INFO", "started with %d workers", 4);
    return 0;
}

Menambahkan cap waktu pada pesan

Anda dapat menambahkan konteks ekstra ke setiap baris sebelum meneruskan format. Di sini kita menambahkan penghitung rekaan sebagai pengganti cap waktu.

#include <stdio.h>
#include <stdarg.h>

static int line_no = 0;

void logf(const char *fmt, ...) {
    printf("#%d ", ++line_no);
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

int main(void) {
    logf("first %s", "event");
    logf("value %d", 7);
    return 0;
}

Mencatat ke stderr

Kesalahan dan diagnostik biasanya diarahkan ke stderr. Gunakan vfprintf(stderr, fmt, args) agar keluaran pencatatan tidak bercampur dengan keluaran program biasa.

#include <stdio.h>
#include <stdarg.h>

void err(const char *fmt, ...) {
    fprintf(stderr, "ERROR: ");
    va_list a; va_start(a, fmt);
    vfprintf(stderr, fmt, a);
    va_end(a);
    fprintf(stderr, "\n");
}

int main(void) {
    err("failed to open %s", "data.txt");
    return 0;
}

Pencatatan bersyarat

Ambang tingkat kerincian memungkinkan Anda membungkam pesan berprioritas rendah. Bandingkan tingkat pesan dengan nilai minimum yang dikonfigurasi sebelum mencetaknya.

#include <stdio.h>
#include <stdarg.h>

static int min_level = 2;

void logf(int level, const char *fmt, ...) {
    if (level < min_level) return;
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

int main(void) {
    logf(1, "debug hidden");
    logf(3, "important %d", 42);
    return 0;
}

Membangun string pesan

Terkadang Anda menginginkan teks yang telah diformat berada di dalam buffer, bukan dicetak. Gunakan vsnprintf untuk merendernya, lalu tentukan tindakan berikutnya.

#include <stdio.h>
#include <stdarg.h>

void capture(const char *fmt, ...) {
    char buf[128];
    va_list a; va_start(a, fmt);
    vsnprintf(buf, sizeof(buf), fmt, a);
    va_end(a);
    printf("captured: %s\n", buf);
}

int main(void) {
    capture("id=%d name=%s", 5, "box");
    return 0;
}

Fungsi max variadik

Variadik juga dapat digunakan untuk pembantu matematika. Berikut fungsi yang mengembalikan bilangan bulat terbesar dari beberapa bilangan, menggunakan parameter jumlah.

#include <stdio.h>
#include <stdarg.h>

int max_of(int count, ...) {
    va_list a; va_start(a, count);
    int best = va_arg(a, int);
    for (int i = 1; i < count; i++) {
        int v = va_arg(a, int);
        if (v > best) best = v;
    }
    va_end(a);
    return best;
}

int main(void) {
    printf("%d\n", max_of(4, 3, 9, 2, 7));
    return 0;
}

Menggabungkan string

Dengan menggunakan penanda akhir NULL, kita dapat menggabungkan sejumlah string ke dalam satu buffer.

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

void join(char *out, const char *first, ...) {
    out[0] = '\0';
    va_list a; va_start(a, first);
    const char *s = first;
    while (s) { strcat(out, s); s = va_arg(a, const char *); }
    va_end(a);
}

int main(void) {
    char buf[64];
    join(buf, "a", "b", "c", (char *)NULL);
    printf("%s\n", buf);
    return 0;
}

Menghitung int variadik

Penghitung berbasis penanda akhir menunjukkan betapa fleksibelnya pola ini. Kita menghitung nilai sampai menemukan 0 sebagai penanda penghentian.

#include <stdio.h>
#include <stdarg.h>

int count_until_zero(int first, ...) {
    va_list a; va_start(a, first);
    int n = 0, v = first;
    while (v != 0) { n++; v = va_arg(a, int); }
    va_end(a);
    return n;
}

int main(void) {
    printf("%d\n", count_until_zero(5, 6, 7, 0));
    return 0;
}

Membungkusnya sebagai makro

Trik yang umum adalah makro yang mengisi tingkat secara otomatis, sehingga pemanggil menulis lebih sedikit. Makro tersebut meneruskan argumen ke fungsi variadik yang sebenarnya.

#include <stdio.h>
#include <stdarg.h>

void real_log(const char *lvl, const char *fmt, ...) {
    printf("[%s] ", lvl);
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

#define LOG_INFO(...) real_log("INFO", __VA_ARGS__)

int main(void) {
    LOG_INFO("ready in %d ms", 50);
    return 0;
}

Menggunakan pencatat

Berikut pencatat mini lengkap yang menggabungkan tingkat dan penghitung cap waktu, siap dimasukkan ke dalam program.

#include <stdio.h>
#include <stdarg.h>

static int seq = 0;

void mylog(const char *lvl, const char *fmt, ...) {
    printf("%04d [%s] ", ++seq, lvl);
    va_list a; va_start(a, fmt);
    vprintf(fmt, a);
    va_end(a);
    printf("\n");
}

int main(void) {
    mylog("INFO", "boot ok");
    mylog("WARN", "low memory: %d MB", 64);
    return 0;
}

Pemeriksaan singkat

Uji pemahaman Anda tentang rancangan pencatatan variadik.

Ringkasan

Anda telah membuat alat variadik praktis:

  • Pencatat yang meneruskan formatnya ke vprintf/vfprintf.
  • Menambahkan tingkat, penghitung, keluaran stderr, dan penyaringan bersyarat.
  • Menggunakan vsnprintf untuk menangkap pesan ke dalam buffer.
  • Melihat pembantu berbasis penanda akhir dan pembungkus makro yang memudahkan penggunaan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Contoh Praktis” gratis?

Ya — teks lengkap “Contoh Praktis” 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 “Contoh Praktis”?

Fungsi logging. 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 4 dari 4.

Berapa lama pelajaran “Contoh Praktis” 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. Makro stdarg
  2. Menulis Fungsi Mirip printf
  3. Masalah Keamanan Tipe
  4. Contoh Praktis
← Kembali ke C Academy