Menulis Fungsi Mirip printf
Argumen variadik.
Menulis Fungsi Mirip printf adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 yang menerima string format
Pemanfaatan variadik yang paling kuat adalah membuat fungsi bergaya printf yang menafsirkan string format.
Format tersebut memberi tahu fungsi berapa banyak argumen yang mengikutinya dan apa tipe masing-masing argumen.
#include <stdio.h>
#include <stdarg.h>
void myprint(const char *fmt, ...) {
printf("format was: %s\n", fmt);
}
int main(void) {
myprint("%d items\n", 5);
return 0;
}Menelusuri string format
Pindai format karakter demi karakter. Saat melihat %, karakter berikutnya adalah penentu konversi yang memberi tahu tipe apa yang harus dibaca.
Semua bagian lainnya dicetak apa adanya.
#include <stdio.h>
#include <stdarg.h>
void scan(const char *fmt) {
for (const char *p = fmt; *p; p++) {
if (*p == '%') printf("[spec:%c]", *(p+1));
else putchar(*p);
}
putchar('\n');
}
int main(void) {
scan("x=%d y=%s");
return 0;
}Membaca tipe yang sesuai
Saat penentunya adalah %d, baca sebuah int. Untuk %s, baca sebuah char *. Format harus sama persis dengan argumen sebenarnya.
#include <stdio.h>
#include <stdarg.h>
void mini(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
for (const char *p = fmt; *p; p++) {
if (*p == '%' && *(p+1) == 'd') {
printf("%d", va_arg(args, int));
p++;
} else putchar(*p);
}
va_end(args);
}
int main(void) {
mini("count=%d\n", 42);
return 0;
}Menangani beberapa penentu
Perluas pemindai agar dapat menangani beberapa konversi. Tambahkan kasus untuk %d, %s, dan %c, lalu baca tipe yang tepat setiap kali.
#include <stdio.h>
#include <stdarg.h>
void fmt_print(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
for (const char *p = fmt; *p; p++) {
if (*p != '%') { putchar(*p); continue; }
p++;
if (*p == 'd') printf("%d", va_arg(args, int));
else if (*p == 's') printf("%s", va_arg(args, char *));
else if (*p == 'c') putchar(va_arg(args, int));
}
va_end(args);
}
int main(void) {
fmt_print("%s is %d\n", "age", 30);
return 0;
}Meng-escape tanda persen
Fungsi format nyata memperlakukan %% sebagai tanda persen literal. Tambahkan sebuah kasus agar pengguna dapat mencetak % yang sebenarnya.
#include <stdio.h>
#include <stdarg.h>
void fp(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
for (const char *p = fmt; *p; p++) {
if (*p == '%') {
p++;
if (*p == '%') putchar('%');
else if (*p == 'd') printf("%d", va_arg(args, int));
} else putchar(*p);
}
va_end(args);
}
int main(void) {
fp("%d%% done\n", 75);
return 0;
}Meneruskan ke vprintf
Sering kali Anda tidak perlu menerapkan kembali pemformatan. Pustaka standar menyediakan vprintf, yang menerima va_list secara langsung.
Pembungkus Anda cukup meneruskan argumennya.
#include <stdio.h>
#include <stdarg.h>
void logline(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
int main(void) {
logline("value = %d, name = %s\n", 7, "box");
return 0;
}Menambahkan awalan
Pendekatan vprintf memudahkan penambahan perilaku di sekitar pemformatan standar, seperti mencetak label sebelum setiap pesan.
#include <stdio.h>
#include <stdarg.h>
void info(const char *fmt, ...) {
printf("[INFO] ");
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
int main(void) {
info("server started on port %d\n", 8080);
return 0;
}Menulis ke buffer dengan vsnprintf
Untuk memformat ke dalam string alih-alih mencetaknya, gunakan vsnprintf(buf, size, fmt, args).
Fungsi ini dibatasi oleh size, sehingga mencegah luapan, dan selalu mengakhiri string dengan null.
#include <stdio.h>
#include <stdarg.h>
void format_into(char *buf, size_t n, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vsnprintf(buf, n, fmt, args);
va_end(args);
}
int main(void) {
char out[64];
format_into(out, sizeof(out), "id-%d", 123);
printf("%s\n", out);
return 0;
}Mengembalikan panjang
vsnprintf mengembalikan jumlah karakter yang seharusnya ditulis. Anda dapat menggunakannya untuk mendeteksi pemotongan atau menentukan ukuran buffer.
#include <stdio.h>
#include <stdarg.h>
int build(char *buf, size_t n, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
int len = vsnprintf(buf, n, fmt, args);
va_end(args);
return len;
}
int main(void) {
char b[10];
int needed = build(b, sizeof(b), "%d-%d", 11, 22);
printf("%s (needed %d)\n", b, needed);
return 0;
}Memilih pendekatan
Ada dua strategi: uraikan format sendiri untuk kendali penuh, atau teruskan ke vprintf/vsnprintf demi ketepatan dan kode yang lebih sedikit.
Untuk sebagian besar kode nyata, meneruskan adalah pilihan yang lebih aman dan sederhana.
#include <stdio.h>
#include <stdarg.h>
void say(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vfprintf(stdout, fmt, args);
va_end(args);
}
int main(void) {
say("%s = %.1f\n", "pi", 3.14);
return 0;
}Ketidakcocokan bersifat tidak terdefinisi
Jika string format menjanjikan tipe yang tidak cocok dengan argumen sebenarnya, perilakunya tidak terdefinisi.
printf("%d", "text") dapat menyebabkan program mengalami kerusakan. Selalu selaraskan format dan argumen.
#include <stdio.h>
int main(void) {
int n = 5;
printf("%d\n", n);
return 0;
}Pemeriksaan singkat
Uji pemahaman Anda tentang pembungkus bergaya printf.
Ringkasan
Anda telah mempelajari cara membuat fungsi mirip printf:
- Gunakan string format sebagai parameter bernama, lalu
.... - Uraikan sendiri penentu
%dan baca tipe yang sesuai, atau - teruskan
va_listke vprintf / vsnprintf untuk pemformatan yang aman dan benar. - Selaraskan format dan tipe argumen untuk menghindari perilaku tidak terdefinisi.
Belajar C dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 39
- Pelajaran
- 144
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menulis Fungsi Mirip printf” gratis?
Ya — teks lengkap “Menulis Fungsi Mirip printf” 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 “Menulis Fungsi Mirip printf”?
Argumen variadik. 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 2 dari 4.
Berapa lama pelajaran “Menulis Fungsi Mirip printf” 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
- Makro stdarg
- Menulis Fungsi Mirip printf
- Masalah Keamanan Tipe
- Contoh Praktis