C
vsnprintf
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);.
Örnek çözümü göster
#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;
}
Kendini test et
-
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
Cevabı göster
boyut sınırı alır — vsnprintf bir boyut parametresi alır; böylece taşma önlenir.
-
vsnprintf parametreleri
- buf
- hedef dize
- size
- azami bayt
- fmt
- format
- args
- va_list
-
vsnprintf çağrısı
vsnprintf(buf, ____, fmt, args);
Cevabı göster
vsnprintf(buf, size, fmt, args);
Sıradaki ders: Değişken argüman desenleri