أمثلة عملية
دالة للتسجيل
أمثلة عملية درس مجاني في C Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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;
}دالة max ذات وسائط متغيرة
تصلح الوسائط المتغيرة أيضًا للمساعدات الرياضية. إليك دالة تعيد أكبر عدد صحيح من بين عدة أعداد، باستخدام وسيط عدد.
#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;
}عدّ أعداد int المتغيرة
يوضح العداد المعتمد على قيمة حارسة مدى مرونة هذا النمط. نعدّ القيم حتى نصل إلى 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لالتقاط الرسائل داخل المخازن. - اطلعت على مساعدات تعتمد على القيم الحارسة، وعلى غلاف ماكرو لتسهيل الاستخدام.
الأسئلة الشائعة
هل درس «أمثلة عملية» مجاني؟
نعم — نص درس «أمثلة عملية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «أمثلة عملية»؟
دالة للتسجيل تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أمثلة عملية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.