Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
C Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <stdio.h> > vsnprintf

vsnprintf() fonksiyonu

Bildirim

int vsnprintf(char *restrict buffer, size_t bufsz, const char *restrict format, va_list arg); (C99)

int vsnprintf_s(char *restrict buffer, size_t bufsz, const char *restrict format, va_list arg); (C11)

Açıklama

Arg parametresi ile gösterilen değişken argüman listesinden aldığı değerleri format parametresi ile gösterilen karakter dizisi içinde düzenleyerek sonuçları boyutu bufsize parametresi ile tanımlanan ve buffer parametresi ile gösterilen karakter dizisine yazar.

En fazla bufsize-1 kadar karakter yazılır. Sonuçta ortaya çıkan karakter dizisi, bufsize sıfır olmadıkça boş bir karakterle ('\0') sonlandırılır. Eğer bufsize sıfır ise, hiçbir şey yazılmaz ve buffer NULL bir işaretçi olabilir, ancak dönüş değeri hesaplanarak geri döndürülür.

Format parametresi ile gösterilen karakter dizisi içinde yer alan karakterleri normal bir şekilde, % işareti ile başlayan format tanımlayıcılarını ise tanımlanan her bir format tanımlayıcı için, arg parametresi ile gösterilen değerler listesinden sıra ile değer okuyarak format karakter dizisini buffer ile gösterilen karakter dizisine yazar.

snprintf() fonksiyonunda format tanımlayıcılarına değer okutmak için format parametresinden sonra gelen ek parametreler kullanılırken vsnprintf() fonksiyonunda arg parametre listesinde yer alan değişken adresleri kullanılmaktadır.

Her durumda, arg parametre değerine vsnprintf() fonksiyonu kullanılmadan önce va_start() fonksiyonu tarafından bir ilk değer verilmiş olmalı ve fonksiyon kullanımından sonra ise va_end() fonksiyonu tarafından serbest bırakılmalıdır.

Kontrol dizisinin içinde hem normal karakterler hem de % işareti ile başlayan format tanımlayıcıları adı verilen ifadeler yer alabilir. vsprintf() fonksiyonu " " işaretleri arasında yer alan normal karakterleri sıra ile akışa yazar. Kontrol dizisi içinde yer alan her bir format tanımlayıcısı için arg parametresi ile gösterilen liste içinden sıra ile bir değer tanımlanır. Ancak, burada dikkat edilmesi gereken 2 önemli nokta vardır:

1. Kontrol dizisi içinde yer alan format tanımlayıcısı kadar arg parametresi ile gösterilen liste içinde argüman tanımlanmalıdır.

2. Arg listesi içindeki her argümanın veri türü kendisine karşılık gelen format tanımlayıcısının veri türüne uygun olmalıdır.

Fonksiyon çalışmaya başladığında, önce kontrol dizisi içinde yer alan ilk karaktere bakar. Eğer normal bir karakter ise hemen karakter dizisine yazar. Eğer bir format tanımlayıcısı ise, bu format tanımlayıcısına karşılık gelen arg parametresi ile gösterilen listedeki ilk argüman değerini karakter dizisine yazar. Kontrol dizisi içindeki bütün karakterleri sıra ile bu şekilde kontrol edip işlem yaptıktan sonra çalışması sona erer.

Format tanımlayıcıları kendilerine karşılık gelen argümanların buffer karakter dizisine nasıl yazılacağını belirler. vsnprintf() fonksiyonu format tanımlayıcıları ile karşılaştığında buffer karakter dizisine farklı bir veri yazacağını ve bu verinin vsnprintf() fonksiyonu çağrılırken karakter dizisinden sonra tanımlanmış olan arg liste değerlerinden sıra ile alınacağını anlar.

Vsnprintf_s() fonksiyonu aynı işlemleri yapar. Farklı olarak, çalışma zamanında aşağıdaki hatalar tespit edildiğinde, yüklenmiş olan kısıtlayıcı işlem fonksiyonu çağrılır:

  • %n format tanımlayıcısı format parametresi ile gösterilen karakter dizisi içinde yer alıyorsa,
  • %s format tanımlayıcısına karşılık gelen parametrelerden herhangi birisi NULL bir işaretçi ise,
  • Buffer veya format parametresi NULL bir işaretçi ise,
  • Bufsz parametre değeri 0 ise veya RSIZE_MAX değerinden büyük ise,
  • Tespit edilebilen diğer hatalar oluşursa,
  • Buffer parametresine yüklenecek karakter dizisinin boyutu bufsz parametre değerinden büyük olursa.

Parametreler

buffer: Format parametresinde oluşturulan karakter dizisinin yazdırılacağı karakter dizisidir.

bufsize: Buffer parametresi için maksimum boyutu tanımlar.

format: Buffer parametresine yazdırılacak olan bir karakter dizisidir.

Bu karakter dizisi buffer karakter dizisine yazılacak olan metni içerir. Karakter dizisi içinde normal karakterler veya % karakteri ile başlayan ve format karakter dizisinden sonra gelen arg parametresi ile gösterilen listedeki değerlerle sıra ile doldurulacak olan format tanımlayıcıları yer alabilir.

Format tanımlayıcı genel yapısı :

%[göstergeler][genişlik][.hassasiyet][uzunluk]format tanımlayıcısı

Bir format tanımlayıcısı toplam 6 farklı ifadeden oluşmaktadır. En baştaki % işareti ile en sonda yer alan format tanımlayıcı harfi mutlaka kullanılmalıdır. [] işaretleri arasında yer alan diğer dört ifade isteğe bağlı olarak kullanılır.

Format tanımlayıcısı Karşılığı
c Karakter
d signed int
i signed int
e Bilimsel gösterim
E Bilimsel gösterim
f Ondalıklı sayı
g e ve %f'den kısa olanı kullanır.
G E ve %f'den kısa olanı kullanır.
o unsigned 8'lik sayı
s Karakter dizisi
u unsigned int
x unsigned 16'lık sayı (Küçük harf)
X unsigned 16'lık sayı (Büyük harf)
p İşaretçi
n Karşılık gelen argüman ekrana yazılan karakterlerin sayısının atandığı int bir değeri gösteren bir işaretçi olmalıdır.
% % işaretini ekrana yazar.
Gösterge Karşılığı
- Verilen alan genişliği içerisindeki değerleri sola yaslar. Ön tanımlı değer sağa yaslamadır.
+ Pozitif sayılar da dahil olmak üzere sonuç değerinin önüne artı veya eksi işareti (+ veya -) ekler. Ön tanımlı olarak, yalnızca negatif sayılar önüne - işareti konur.
Boşluk karakteri Hiçbir işaret yazılmayacaksa, değerden önce bir boşluk eklenir.
# o, x veya X format tanımlayıcıları ile kullanıldığında, sıfırdan farklı değerler için değerlerin önüne sırasıyla 0, 0x veya 0X ifadeleri konur. E, E ve f ile birlikte kullanıldığında, ondalık işaretinden sonra değer olmasa bile elde edilen değerin ondalık bir nokta içermesini sağlar. Ön tanımlı olarak, ondalık işaretinden sonra değer yoksa, herhangi bir ondalık basamağı yazılmaz. G veya g ile kullanıldığında, sonuç e veya E ile aynıdır, ancak takip eden sıfırlar kaldırılmaz.
0 Değerin sol tarafında yer alan boşluklar sıfır değeriyle doldurulur.
Genişlik Karşılığı
Sayı Yazdırılacak minimum karakter sayısıdır. Yazdırılacak değer bu sayıdan daha kısaysa, sonuç boşluklarla doldurulur. Sonuç daha büyük olsa bile değer kesilmez.
* Genişlik, format karakter dizisinde belirtilmez, ancak biçimlendirilmesi gereken argümandan önce ek bir tamsayı değeri argümanı olarak belirtilir.
Hassasiyet Karşılığı
.sayı
  • Tamsayı format tanımlayıcıları için (d, i, o, u, x, X) - hassasiyet yazılacak minimum basamak sayısını ifade eder. Yazılacak değer bu sayıdan kısaysa, elde edilen değerin baş tarafı sıfırlarla doldurulur. Sonuç daha uzun olsa bile değer kesilmez. 0 değerinin hassasiyeti, 0 değeri için karakter yazılmadığını gösterir.
  • E, e ve f format tanımlayıcıları için bu değer, ondalık noktadan sonra yazdırılacak basamak sayısını gösterir.
  • G ve g format tanımlayıcıları için bu değer, yazdırılacak maksimum önemli basamak sayısıdır.
  • s format tanımlayıcısı için bu değer yazdırılacak maksimum karakter sayısıdır. Ön tanımlı olarak, boş karakterle ('\0') karşılaşılana kadar tüm karakterler yazdırılır.
  • c format tanımlayıcısı için bu değerin bir etkisi yoktur. Hassasiyet belirtilmediğinde, ön tanımlı değer 1'dir.
.* Hassasiyet, format karakter dizisinde belirtilmez, ancak formatlanması gereken argümandan önce ek bir tamsayı değeri olarak belirtilir.

uzunluk : İsteğe bağlı olarak tanımlanan bu değer okutulacak argümanın boyutunu gösterir. hh, h, l, ll, j, z, t, L değerlerinden biri kullanıldığında, karşılık gelen argümanın gösterdiği veri tipini değiştirir.

Uzunluk değeri Format tanımlayıcısı Okunacak değer
(Yok) c int
s char*
d, i int
u, o, x, X unsigned int
f, F, e, E, a, A, g, G double
n int*
p void*
h d, i short
u, o, x, X unsigned short
n short*
hh (C99) d, i signed char
u, o, x, X unsigned char
n signed char*
j (C99) d, i intmax_t
u, o, x, X uintmax_t
n intmax_t*
l c wint_t
s wchar_t*
d, i long
u, o, x, X unsigned long
f, F, e, E, a, A, g, G double (C99)
n long*
L f, F, e, E, a, A, g, G long double
ll (C99) d, i long long
u, o, x, X unsigned long long
n long long*
t (C99) d, i ptrdiff_t
u, o, x, X unsigned ptrdiff_t
n ptrdiff_t*
z (C99) d, i signed size_t
u, o, x, X size_t
n signed size_t*

arg : va_start() ile ilk değer verilen değerler listesini tanımlayan bir değerdir.

Dönüş değeri

Vsnprintf() fonksiyonu buffer parametresine yazılan karakter sayısını int bir değer olarak geri döndürür. Hata durumunda negatif bir sayı geri döndürür. Eğer, sonuçta elde edilen karakter dizisi bufsz parametre değerinin getirdiği sınır nedeniyle kesilirse, fonksiyon format parametresine geçirilen yazılacak olan toplam karakter sayısını (sonlandırıcı boş karakter hariç) geri döndürür.

Vsnprintf_s() fonksiyonu buffer parametresine yazılan karakter sayısını int bir değer olarak geri döndürür (sonda yer alan boş karakter hariç ('\0')). Eğer bir çalışma zamanı kısıt ihlal hatası veya bir kodlama hatası oluşursa negatif bir sayı geri döndürür.

Örnek


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

void ArgList(int write, char *buffer, const char * format, ...);

int main(void)
{
    char buffer[100];
    char cd;
    int id;
    float fd;
    char cdizi[20];

    /* Karakter dizisine yazma işlemi */
    ArgList(1, buffer, "%c %d %.2f %s", 'P', 92, 843.25, "Bilgisayar");

    /* Karakter dizisinden okuma işlemi */
    ArgList(0, buffer, "%c %d %f %s", &cd, &id, &fd, cdizi);
    printf("Karakter dizisinden okunan değerler: %c %d %.2f %s", cd, id, fd, cdizi);

    return 0;
}

void ArgList(int write, char *buffer, const char *format, ...)
{
  va_list args;
  va_start (args, format);
  if (write) vsnprintf (buffer, 100, format, args);
  else vsscanf (buffer, format, args);
  va_end (args);
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

Karakter dizisinden okunan değerler: P 92 843.25 Bilgisayar

Program birer adet char, int, float ve karakter dizisi değeri oluşturur. Değerlere karşılık gelen format tanımlayıcılarını içeren bir karakter dizisi ile farklı değerleri kullanarak ArgList() fonksiyonunu karakter dizisine yazma amacıyla çağırır. Fonksiyon içinde va_start() ile oluşturulan argüman listesi ve format parametre değeri ile vsprintf() fonksiyonu çağrılarak karakter dizisine yazma işlemi yapılır. Daha sonra aynı işlemler vsscanf() fonksiyonu ile karakter dizisinden okuma amacıyla yapılır. Okunan değerler ekrana yazılır.