0Pricing
C Academy · บทเรียน

ตัวอย่างการใช้งานจริง

ฟังก์ชันบันทึกข้อมูล

ตัวอย่างการใช้งานจริง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. มาโคร stdarg
  2. การเขียนฟังก์ชันแบบ printf
  3. ข้อควรระวังด้านความปลอดภัยของชนิด
  4. ตัวอย่างการใช้งานจริง
← กลับไปที่ C Academy