CodeBlanks Logo Icon CodeBlanks

vsnprintf

  • C kursu
  • Orta seviye
  • Ders 79/116
  • 5 dk

vsnprintf ile güvenli biçimlendirme öğrenirsin.

vsnprintf

vsnprintf, değişken argümanları bir dizeye (char dizisine) güvenli biçimde yazar. vsprintf'ten farkı, bir boyut sınırı almasıdır; taşmayı önler.

İmza: int vsnprintf(char *buf, size_t size, const char *fmt, va_list args). buf hedef dize, size en fazla kaç bayt yazılacağı, fmt format, args ise va_list. Dönüş değeri yazılması gereken toplam bayt sayısıdır; size'ı aşarsa çıktı kısaltılır. Bu güvenlik sınırı, vsprintf'te yoktur ve taşma riski taşır. Modern C kodunda her zaman vsnprintf tercih edilir. Örnek: vsnprintf(buf, 64, "Sonuc: %d", args).

format_into örneği

Basit bir sarmalayıcı (wrapper) yazalım: format_into bir tampona güvenli biçimde yazar. Bu, günlük mesajları veya rapor satırları oluşturmak için kullanışlıdır.

Tanım: void format_into(char *buf, int size, const char *fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(buf, size, fmt, args); va_end(args); }. va_start'ın ikinci parametresi fmt'tir. vsnprintf hem buf'ya yazar hem de size'ı aşmayı engeller. Çağrı: char buf[64]; format_into(buf, 64, "Sonuc: %d ve %s", 10, "tamam");. Bundan sonra buf içinde Sonuc: 10 ve tamam yazar. Daha sonra printf("%s\n", buf) ile ekrana alınabilir.

Uygulama format_into fonksiyonu

void format_into(char *buf, int size, const char *fmt, ...) yaz. va_list args; va_start(args, fmt); vsnprintf(buf, size, fmt, args); va_end(args); çağır. main'de char buf[64];, format_into(buf, 64, "Sonuc: %d ve %s", 10, "tamam");, printf("%s\n", buf);.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdarg.h>

// format_into: buf'ya güvenli biçimde yaz
// va_list tanımla, va_start ile başlat, vsnprintf ile güvenli yaz, va_end ile kapat
// main: char buf[64]; format_into(buf, 64, "Sonuc: %d ve %s", 10, "tamam"); printf("%s\n", buf);

int main(void) {
    // buraya yaz
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdarg.h>

void format_into(char *buf, int size, const char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vsnprintf(buf, size, fmt, args);
    va_end(args);
}

int main(void) {
    char buf[64];
    format_into(buf, 64, "Sonuc: %d ve %s", 10, "tamam");
    printf("%s\n", buf);
    return 0;
}

Beklenen çıktı

Sonuc: 10 ve tamam

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 vsnprintf, vsprintf'ten neden daha güvenlidir?

  • daha hızlı çalışır
  • daha az bellek kullanır
  • va_list almaz
  • boyut sınırı alır Doğru cevap

Açıklama: vsnprintf bir boyut parametresi alır; böylece taşma önlenir.

2 vsnprintf parametreleri

Kavram Anlamı
buf hedef dize
size azami bayt
fmt format
args va_list

3 vsnprintf çağrısı

Soru
vsnprintf(buf, ____, fmt, args);
Cevap
vsnprintf(buf, size, fmt, args);

Açıklama: size parametresi taşmayı önler.

Orta seviye bölümündeki tüm dersler