Biçimli Çıktı İşlevleri
Önceki Biçimli Çıktı Sonraki
Biçimli Çıktı İşlevleri
Bu bölümde printf ve ilgili işlevlerin nasıl çağrıldığı anlatılmıştır. Bu işlevlerin prototipleri stdio.h başlık dosyasındadır. Bu işlevlerin değişken sayıda argüman almalarından dolayı, onları kullanmadan önce prototipleri ile bildirmelisiniz. Şüphesiz bunu yapmanın en kolay yolu onları içeren stdio.h başlık dosyasının kaynak dosyasında içerilmesidir.
int printf
(const char *şablon, …)
işlev
printf işlevi şablon biçim dizgesinin denetimi altında isteğe bağlı argümanları standart çıktıya basar ve basılan karakterlerin sayısı ile döner; bir hata oluşursa bir negatif değerle döner.
int wprintf
(const wchar_t *şablon, …)
işlev
wprintf işlevi şablon geniş biçim dizgesinin denetimi altında isteğe bağlı argümanları standart çıktıya basar ve basılan geniş karakterlerin sayısı ile döner; bir hata oluşursa bir negatif değerle döner.
int fprintf
(FILE       *akım,
 const char *şablon,
 …)
işlev
Bu işlev printf gibidir, tek farkla, çıktıyı standart çıktıya değil akım’a yazar.
int fwprintf
(FILE          *akım,
 const wchar_t *şablon,
 …)
işlev
Bu işlev wprintf gibidir, tek farkla, çıktıyı standart çıktıya değil akım’a yazar.
int sprintf
(char       *s,
 const char *şablon,
 …)
işlev
Bu işlev printf gibidir, tek farkla, çıktıyı standart çıktıya değil s dizisine yazar. Dizge bir boş karakterle sonlandırılır.
sprintf işlevi sonlandırıcı boş karakter hariç s dizisine yazılan karakterlerin sayısı ile döner.
Bu işlevin davranışı, birbirini kapsayan nesneler arasında kopyalama yapılırsa, örneğin, %s belirtecinin argümanı olarak s dizgesi verilmişse, tanımsızdır. Bkz. Kopyalama ve Birleştirme.
Uyarı
sprintf işlevi tehlikeli olabilir. Potansiyel olarak s dizgesi için ayrılan yer biçim dizgesinin ürettiği dizge için yetersiz olabilir. Alan genişliği parametresinin en küçük alan genişliğini belirttiğini ve kimi zaman bu genişliğin aşılabildiğini hatırlayın.
Bu sorundan kaçımak için aşağıda açıklanacak olan snprintf veya asprintf işlevlerini kullanabilirsiniz.
int swprintf
(wchar_t       *s,
 size_t         boyut,
 const wchar_t *şablon,
 …)
işlev
Bu işlev printf gibidir, tek farkla, çıktıyı standart çıktıya değil ws geniş karakter dizisine yazar. Dizge bir boş geniş karakterle sonlandırılır. boyut argümanı ile üretilecek en büyük karakter sayısı belirtilir. Sonlandırıcı boş karakter de bu sınırın içinde olduğundan ws dizgesi için en az boyut geniş karakterlik yer ayrılmalıdır.
swprintf işlevi sonlandırıcı boş geniş karakter hariç ws geniş dizisine yazılan karakterlerin sayısı ile döner. Çıktı belirtilen tampona sığmazsa bir negatif sayı ile döner. Bu davranışı ile işlev snprintf işlevinden farklıdır.
Not
Benzeri olan dar yönlenimli akım işlevleri daha az parametre alır. swprintf işlevi aslında snprintf işlevinin karşılığıdır. sprintf işlevi tehlikeli olabildiğinden, ISO C komitesi aynı yanlışı tekrar yapmaktan kaçınmalı ve sprintf işlevinin tam karşılığı olan bir işlevi tanımlamama kararı almalıdır.
int snprintf
(char       *s,
 size_t      boyut,
 const char *şablon,
 …)
işlev
Bu işlev sprintf gibidir, tek farkla, boyut argümanı ile üretilecek en büyük karakter sayısı belirtilir. Sonlandırıcı boş karakter de bu sınırın içinde olduğundan s dizgesi için en az boyut karakterlik yer ayrılmalıdır.
snprintf işlevi sonlandırıcı boş geniş karakter hariç s dizisine yazılan karakterlerin sayısı ile döner. Bu değer boyut'a eşit ya da ondan büyükse sonucun tüm karakterleri s dizisine yazılamamış demektir. Bu durumda daha büyük çıktı dizisi ile çağrıyı yinelemelisiniz. Aşağıda bunun yapıldığı bir örnek vardır:
/*  isim isminde ve deger değerinde
    bir değişkenin değerini açıklayan bir ileti oluşturalım. */
char *
ileti_yap (char *isim, char *deger)
{
  /* Nasılsa 100 karakterlikten daha fazla yere ihtiyaç olmaz. */
  int boyut = 100;
  char *tampon = (char *) xmalloc (boyut);
  int nkar;
  if (tampon == NULL)
    return NULL;

  /* Ayrılan alana iletiyi yazmaya çalışalım. */
  nkar = snprintf (tampon, boyut, "%s değişkeninin değeri %s'dir",
                   isim, deger);
  if (nkar >= boyut)
    {
      /* Artık ne kadar yere ihtiyaç olduğunu
         bildiğimize göre tamponu yeniden ayıralım. */
      tampon = (char *) xrealloc (tampon, nkar + 1);
      boyut = nkar + 1;
      buffer = (char *) xrealloc (tampon, boyut);

      if (tampon != NULL)
        /* Tekrar deniyoruz. */
        snprintf (tampon, boyut, "%s değişkeninin değeri %s'dir",
                  isim, deger);
    }
  /* Son çağrı çalıştığından dizge ile dönüyoruz. */
  return tampon;
}
Uygulamada, asprintf işlevini kullanmak çok daha kolaydır.
Dikkat
GNU C kütüphanesinin 2.1 öncesi sürümlerinde dönüş değeri sonlandırıcı boş karakter hariç saklanan karakterlerin sayısıydı. s dizisinde yeterli yer yoksa -1 dönüyordu. Bu, ISO C99 standardına uyum sırasında değiştirildi.
Önceki Üst Ana Başlık Sonraki
Diğer Çıktı Dönüşümleri Başlangıç Biçimli Çıktıyı Özdevimli Ayırma
Bir Linux Kitaplığı Sayfası