Pratik Örnekler
Bir logging işlevi
Pratik Örnekler, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Bir günlükleme işlevi
Bir günlükleyici, değişken sayıda bağımsız değişkenlerin gerçek dünyadaki kusursuz kullanım alanıdır. printf gibi log_msg("user %s scored %d", name, score) çağrısı yapmak isteriz.
Bu derste küçük ve kullanışlı bir günlükleme aracı oluşturacağız.
#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;
}Önem düzeyi eklemek
Gerçek günlükleyiciler iletileri INFO veya ERROR gibi bir düzeyle etiketler. Düzey için biçim dizisinden önce sabit bir parametre ekleyin.
#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;
}İletilere zaman damgası eklemek
Biçimi aktarmadan önce her satıra ek bağlam ekleyebilirsiniz. Burada zaman damgası yerine sahte bir sayaç ekliyoruz.
#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'e günlükleme
Hatalar ve tanılama bilgileri genellikle stderr kanalına gönderilir. Günlük çıktısının normal program çıktısıyla karışmaması için vfprintf(stderr, fmt, args) kullanın.
#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;
}Koşullu günlükleme
Ayrıntı düzeyi eşiği, düşük öncelikli iletileri susturmanızı sağlar. Yazdırmadan önce ileti düzeyini yapılandırılmış minimum değerle karşılaştırın.
#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;
}İleti dizisi oluşturmak
Bazen biçimlendirilmiş metni yazdırmak yerine bir arabellekte tutmak istersiniz. Oluşturmak için vsnprintf kullanın, ardından ne yapacağınıza karar verin.
#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;
}Değişken sayıda bağımsız değişken alan bir maksimum işlevi
Değişken sayıda bağımsız değişken matematik yardımcıları için de kullanılabilir. Burada, bir sayı parametresi kullanarak birkaç tam sayı arasındaki en büyüğünü döndüren bir işlev yer alıyor.
#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;
}Dizeleri birleştirmek
NULL sentinel'ı kullanarak istediğimiz sayıda dizeyi tek bir arabellekte birleştirebiliriz.
#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;
}Değişken sayıda int değerini saymak
Sentinel tabanlı bir sayaç, bu desenin ne kadar esnek olduğunu gösterir. Sonlandırıcı bir 0 değerine ulaşana kadar değerleri sayarız.
#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;
}Makro olarak sarmalamak
Yaygın bir yöntem, düzeyi otomatik olarak dolduran ve çağıranın daha az yazmasını sağlayan bir makro kullanmaktır. Makro, gerçek değişken sayıda bağımsız değişken alan işleve aktarır.
#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;
}Günlükleyiciyi kullanıma almak
Burada düzeyi ve zaman damgası sayacını birleştiren, doğrudan programa eklenmeye hazır eksiksiz bir mini günlükleyici bulunuyor.
#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;
}Hızlı kontrol
Değişken sayıda bağımsız değişken kullanan günlükleme tasarımını ne kadar anladığınızı test edin.
Özet
Uygulamalı değişken sayıda bağımsız değişken araçları oluşturdunuz:
- Biçimini
vprintf/vfprintfişlevine aktaran bir günlükleyici. - Düzeyler, sayaçlar, stderr çıktısı ve koşullu filtreleme eklediniz.
- İletileri arabelleklerde yakalamak için
vsnprintfkullandınız. - Sentinel tabanlı yardımcıları ve kullanışlı bir makro sarmalayıcıyı gördünüz.
Yapay zeka eğitmeniyle C öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 39
- Dersler
- 144
Sıkça Sorulan Sorular
“Pratik Örnekler” dersi ücretsiz mi?
Evet — “Pratik Örnekler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Pratik Örnekler” dersinde ne öğreneceğim?
Bir logging işlevi C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Pratik Örnekler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.