C Academy · Ders

printf Benzeri İşlevler Yazma

Değişken sayıda bağımsız değişken

2. ders / 413 adım

printf Benzeri İşlevler Yazma, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. 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.

Biçim dizisi alan işlevler

Değişken sayıda bağımsız değişken kullanmanın en güçlü yollarından biri, bir biçim dizisini yorumlayan printf tarzı işlevler oluşturmaktır.

Biçim, işlevi kaç bağımsız değişkenin izleyeceğini ve her birinin türünü belirtir.

#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;
}

Biçim dizisi üzerinde gezinmek

Biçimi karakter karakter tarayın. Bir % gördüğünüzde sonraki karakter, hangi türü okuyacağınızı belirten bir dönüştürme belirtecidir.

Diğer her şey olduğu gibi yazdırılır.

#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;
}

Eşleşen türü okumak

Belirteç %d olduğunda bir int okuyun. %s için bir char * okuyun. Biçim, gerçek bağımsız değişkenlerle tam olarak eşleşmelidir.

#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;
}

Birden çok belirteci işlemek

Tarayıcıyı birkaç dönüştürmeyi işleyecek şekilde genişletin. %d, %s ve %c için durumlar ekleyerek her seferinde doğru türü okuyun.

#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;
}

Yüzde işaretini kaçışlamak

Gerçek biçim işlevleri, %% ifadesini olduğu gibi yazdırılacak bir yüzde işareti olarak ele alır. Kullanıcıların gerçek bir % yazdırabilmesi için bir durum ekleyin.

#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;
}

vprintf işlevine aktarmak

Çoğu zaman biçimlendirmeyi yeniden uygulamak istemezsiniz. Standart kütüphane, doğrudan bir va_list alan vprintf işlevini sunar.

Sarmalayıcınız yalnızca bağımsız değişkenleri iletir.

#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;
}

Ön ek eklemek

vprintf yaklaşımı, her iletinin önüne bir etiket yazdırmak gibi davranışları standart biçimlendirmenin çevresine eklemeyi kolaylaştırır.

#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;
}

vsnprintf ile arabelleğe yazmak

Yazdırmak yerine bir diziyi biçimlendirmek için vsnprintf(buf, size, fmt, args) kullanın.

İşlem size ile sınırlandırılır; böylece taşma önlenir ve dizenin sonuna her zaman null karakteri eklenir.

#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;
}

Uzunluk döndürmek

vsnprintf, yazılmış olması gereken karakter sayısını döndürür. Bunu kırpılmayı algılamak veya bir arabelleğin boyutunu belirlemek için kullanabilirsiniz.

#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;
}

Yaklaşımınızı seçmek

İki strateji vardır: tam denetim için biçimi kendiniz ayrıştırmak veya doğruluk ve daha az kod için vprintf/vsnprintf işlevine aktarmak.

Gerçek kodların çoğunda aktarma, daha güvenli ve basit bir seçimdir.

#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;
}

Uyumsuzluk tanımsızdır

Biçim dizisi gerçek bağımsız değişkenle eşleşmeyen bir tür vaat ederse davranış tanımsızdır.

printf("%d", "text") çökebilir. Biçim ile bağımsız değişkenleri her zaman uyumlu tutun.

#include <stdio.h>

int main(void) {
    int n = 5;
    printf("%d\n", n);
    return 0;
}

Hızlı kontrol

printf tarzı sarmalayıcıları ne kadar anladığınızı test edin.

Özet

printf benzeri işlevler oluşturmayı öğrendiniz:

  • Adlandırılmış parametre olarak bir biçim dizisi alın, ardından ... kullanın.
  • Ya % belirteçlerini kendiniz ayrıştırıp eşleşen türleri okuyun ya da
  • güvenli ve doğru biçimlendirme için va_list değerini vprintf / vsnprintf işlevine aktarın.
  • Tanımsız davranışı önlemek için biçimi ve bağımsız değişken türlerini uyumlu tutun.
Başlamak ücretsiz

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

“printf Benzeri İşlevler Yazma” dersi ücretsiz mi?

Evet — “printf Benzeri İşlevler Yazma” 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.

“printf Benzeri İşlevler Yazma” dersinde ne öğreneceğim?

Değişken sayıda bağımsız değişken 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 2. dersidir.

“printf Benzeri İşlevler Yazma” 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.

Bu kursun tüm dersleri

  1. stdarg Makroları
  2. printf Benzeri İşlevler Yazma
  3. Tür Güvenliği Kaygıları
  4. Pratik Örnekler
← C Academy Sayfasına Dön