ตัวอย่างการใช้งานจริง
ฟังก์ชันบันทึกข้อมูล
ตัวอย่างการใช้งานจริง เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันบันทึกเหตุการณ์
ตัวบันทึกเหตุการณ์เป็นการใช้งานอาร์กิวเมนต์แบบแปรผันในโลกจริงที่เหมาะสมอย่างยิ่ง เราต้องการเรียก log_msg("user %s scored %d", name, score) เช่นเดียวกับ printf
บทเรียนนี้จะสร้างเครื่องมือบันทึกเหตุการณ์ขนาดเล็กที่ใช้งานได้จริง
#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;
}การเพิ่มระดับความรุนแรง
ตัวบันทึกเหตุการณ์จริงจะกำกับข้อความด้วยระดับ เช่น INFO หรือ ERROR เพิ่มพารามิเตอร์แบบตายตัวสำหรับระดับไว้ก่อนสตริงรูปแบบ
#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;
}การประทับเวลาให้ข้อความ
คุณสามารถเพิ่มบริบทให้แต่ละบรรทัดก่อนส่งต่อรูปแบบได้ ในที่นี้เราจะใส่ตัวนับจำลองไว้ด้านหน้าแทนการประทับเวลา
#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;
}การบันทึกไปยัง stderr
ข้อผิดพลาดและข้อมูลวินิจฉัยมักส่งไปยัง stderr ใช้ vfprintf(stderr, fmt, args) เพื่อไม่ให้ผลลัพธ์บันทึกเหตุการณ์ปะปนกับผลลัพธ์ปกติของโปรแกรม
#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;
}การบันทึกแบบมีเงื่อนไข
เกณฑ์ระดับความละเอียดช่วยปิดข้อความที่มีลำดับความสำคัญต่ำได้ ให้เปรียบเทียบระดับข้อความกับค่าต่ำสุดที่กำหนดไว้ก่อนพิมพ์
#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;
}การสร้างสตริงข้อความ
บางครั้งคุณต้องการให้ข้อความที่จัดรูปแบบแล้วอยู่ในบัฟเฟอร์แทนการพิมพ์ ใช้ vsnprintf เพื่อสร้างข้อความ จากนั้นจึงตัดสินใจว่าจะดำเนินการอย่างไร
#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;
}ฟังก์ชันหาค่าสูงสุดแบบแปรผัน
อาร์กิวเมนต์แบบแปรผันใช้กับตัวช่วยคำนวณทางคณิตศาสตร์ได้เช่นกัน นี่คือตัวอย่างฟังก์ชันที่คืนค่าจำนวนเต็มที่มากที่สุดจากหลายตัว โดยใช้พารามิเตอร์จำนวน
#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;
}การต่อสตริง
การใช้เครื่องหมายสิ้นสุด NULL ทำให้เราสามารถนำสตริงจำนวนเท่าใดก็ได้มาต่อกันในบัฟเฟอร์เดียว
#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;
}การนับจำนวนเต็มแบบแปรผัน
ตัวนับที่ใช้เครื่องหมายสิ้นสุดแสดงให้เห็นว่ารูปแบบนี้ยืดหยุ่นเพียงใด เราจะนับค่าไปจนกว่าจะพบ 0 ซึ่งเป็นค่าปิดท้าย
#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;
}การห่อหุ้มเป็นมาโคร
เทคนิคที่ใช้กันทั่วไปคือสร้างมาโครที่เติมระดับให้โดยอัตโนมัติ ทำให้ผู้เรียกเขียนโค้ดน้อยลง มาโครจะส่งต่อไปยังฟังก์ชันแบบแปรผันตัวจริง
#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;
}การนำตัวบันทึกเหตุการณ์ไปใช้งาน
นี่คือตัวบันทึกเหตุการณ์ขนาดเล็กที่สมบูรณ์ ซึ่งรวมระดับและตัวนับเวลาไว้ด้วยกัน และพร้อมนำไปใส่ในโปรแกรม
#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;
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการออกแบบการบันทึกเหตุการณ์แบบแปรผัน
สรุปทบทวน
คุณได้สร้างเครื่องมือแบบแปรผันที่ใช้งานได้จริง:
- ตัวบันทึกเหตุการณ์ที่ส่งต่อรูปแบบไปยัง
vprintf/vfprintf - เพิ่มระดับ ตัวนับ ผลลัพธ์ไปยัง stderr และการกรองแบบมีเงื่อนไข
- ใช้
vsnprintfเพื่อเก็บข้อความลงในบัฟเฟอร์ - ได้เห็นตัวช่วยที่ใช้เครื่องหมายสิ้นสุดและมาโครห่อหุ้มเพื่อความสะดวก
คำถามที่พบบ่อย
บทเรียน “ตัวอย่างการใช้งานจริง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวอย่างการใช้งานจริง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวอย่างการใช้งานจริง”
ฟังก์ชันบันทึกข้อมูล คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวอย่างการใช้งานจริง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม
ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- มาโคร stdarg
- การเขียนฟังก์ชันแบบ printf
- ข้อควรระวังด้านความปลอดภัยของชนิด
- ตัวอย่างการใช้งานจริง