Yazan : Şadi Evren ŞEKER

Bu yazının amacı, C dilinin en çok kullanılan fonksiyonlarından birisi olan printf fonksiyonu ve türevlerini açıklamaktır. Bu fonksiyonlar aşağıdaki şekilde sıralanabilir:

fprintf, printf, snprintf, sprintf

Bu fonksiyonların tamamı stdio.h kütüphanesi içerisinde bulunur ve bu fonksiyonların prototipleri aşağıdaki şekildedir:

#include 

int fprintf(FILE *restrict stream, const char *restrict format, ...);
int printf(const char *restrict format, ...);
int snprintf(char *restrict s, size_t n, const char *restrict format, ...);
int sprintf(char *restrict s, const char *restrict format, ...);

Yukarıdaki fonksiyonlar ve bu yazı kapsamında açıklanacak herşey, ISO C standardı olarak bilinen ve IEEE 1003.1-2001 fasikülünde yayınlanan standartlara uygun olarak hazırlanmıştır. Ancak bazı derleyicilerde ııfarkllklar olabilmektedir ve bu farklılıklar standart dışı olarak kabul edilir.

Fonksiyonların kısaca görevleri aşağıdaki şekildedir:

fprintf() fonksiyonu, ilk parametre olarak aldığı akışa (stream) sonucu yönlendiren printf fonksiyonudur. Ve bu akış printf fonksiyonunda varsayılan olarak stdout (standart çıkış ki özel bir ayar yapılmadıkça ekrandır) olarak ayarlanmıştır.

sprintf() fonksiyonu, string (dizgi) içerisine yazdırmak için kullanılır ve ilk karakteri de buradan gelmektedir. Bu fonksiyonun en önemli özelliği, bastırdığı değerlerin sonuna dizgi sonu (end of string) anlamnda ‘’ karakteri koymasıdır.

snprintf() fonksiyonu ise, sprintf() fonksiyonu ile tamamen aynı çalışmakta olup, tek farkı ilave bir sayı alıyor olmasıdır. Bu sayede kaç karakterin basılacağı fonksiyon çağırılırken belirtilebilir.

Örnek kullanım:

printf("%1$d:%2$.*3$d:%4$.*3$dn", hour, min, precision, sec);

Yukarıdaki kodda, öncelikle çift tırnaklar arasında bulunan ve ekrana basılacak olan değerlerin biçemlendirildiği (format) bir dizgi (string) bulunmakta ve ardından da bu dizginin içerisine yerleştirilecek olan parametreler yer almaktadır.

Yukarıdaki örnekte de görüldüğü üzere, bazı karakterlerin özel anlamları vardır. Bu özel anlamlı karakterlere bayrak anlamında flag ismi verilir.

Aşğaıda, printf fonksiyonunun biçem dizgisi içerisinde bulunan bu bayrakların açıklamaları verilmiştir:

#include 
int main(){
	char ilk [20];
	char *ikinci="alibaba";
	int i = 3;
	sprintf(ilk,"%d ve %s",i , ikinci);
	printf("%s",ilk);
}

Yukarıdaki kodun çıktısı aşağıdaki şekildedir:


Görüldüğü üzere, öncelikle sprintf fonksiyonu ile, bir başka dizginin (string) içerisine bir değer konulmuş ardından da bu değer printf fonksiyonu ile ekrana basılmıştır.

#include 
int main(){
	FILE *fp;
	char *ikinci="alibaba";
	int i = 3;
	fp= fopen("out.txt","w");
	fprintf(fp,"%d ve %s",i , ikinci);
	fclose(fp);	
}

Yukarıdaki kodun ekran çıktısı aşağıdaki şekildedir:

Görüldüğü üzere fp isimli bir dosya göstericisi tanımlanmış ve bu dosya göstericisinin içerisine yeni bir “out.txt” dosyası açılmış ve bu açılmanın ardından içerik dosyaya basmıştır. Daha fazla bilgi için dosya işlemleri başlıklı yazı bu bağlantıya tıklanarak okunabilir.

Fonksiyonların bayrakları (flags):

0 bu bayrak, d,i,o,u,x,X,a,A,e,E,f,F,g ve G bayraklarının başına gelerek hane sayısını belirtilen haneye tamamlar ve bu tamamlama sırasında 0 ekleyerek hane sayısını arttırır.

d,i tam sayıların ekrana basılması için kullanılır (integer) birden fazla kere tekrar edebilir. Örneğin %04d şeklinde yazılması halinde ekrana 4 haneye tamamlanarak basılır. Bu hanelere karşılık gelen sayı olmaması durumunda 0 konularak tamamlanır. Ayrıca sadece %4d olarak kullanılması durumunda da 4 karakter kapyalacak şekilde diğer haneler boşluk ile doldurularak ekrana basılır.

Örnek: printf(“%04d%4d%d”, 12,12,12);

Çıktı:0012 1212

o ingilizcedeki octal (sekizlik) kelimesinden gelir. Verilen sayıyı sekizlik tabana çevirerek basar. Yönsüzdür. Yani pozitif sayı çıktısı verir. Eksi sayılar için azami tam sayı değerinden çıkarma yaparak basar:

Örnek: printf(“%o %o”,123,-123);

Çıktı:173 37777777605

u ingilizcedeki unsigned (yönsüz) kelimesinden gelir ve verilen sayının karşılığını her zaman pozitif olarak döndürür. Sayı şayet pozitif ise zaten sorun olmadan basar. Sayı şayet negatif ise sayıyı, maksimum tam sayı değerinden çıkararak basar:

Örnek: printf(“%u %u”,123,-123);

Çıktı:123 4294967173

x ingilizcedeki hexadecimal (onaltılık) kelimesinin 3. harfinden esinlenerek kabul görmüş olan bayraktır. Verilen sayıyı onaltılık tabana çevirerek basar ve yönsüzdür. Eksi sayıları, maksimum sayıdan çıkararak basar:

Örnek: printf(“%x %x”,123,-123);

Çıktı:7b ffffff85

X bir önceki bayrak olan x bayrağı gibi verilen sayıyı onaltılık tabana çevirir ancak çıktıdaki harfleri büyük olarak basar:

Örnek: printf(“%x %x”,123,-123);

Çıktı:7B FFFFFF85

f,F verilen sayıyı ondalıklı şekilde ekrana yazmaya yarar.

Örnek: printf(“%f %d”, 123.456,123.456);

Çıktı:123.456 123

e,E ingilizcedeki exponential (üssel) kelimesinin ilk harfinden gelmektedir ve verilen sayıyı 10 üzeri şeklinde yazar. Örneğin 3.456e7 gösterimi aslında 3.456 x 10^7 şeklindedir ve 34560000 sayısına karşılık gelmektedir.

Örnek: printf(“%e”,34560000);

Çıktı:3.456000e+07

g,G bir önceki parametrede olduğu üzere üssel gösterime çevirerek ekrana basar ancak gereksiz olan ondalık kısımdaki sıfırları temizler:

Örnek:printf(“%g”,34560000);

Çıktı:3.456e+07

a,A verilen sayıyı bir önceki bayrakta olduğu gibi üssel gösterime çevirir. Ayrıca sayıyı onaltılık sisteme (hexadecimal) de çevirir. Bu çevirim sonucunda e harfi onaltılık sistemde anlamlı bir harf olduğu için üssel gösterimi p harfi ile yapar. Yani verilen sayı önce onaltılık sisteme çevirilecek ve ardından çıkan sayı üssel olarak gösterilecektir.

Örnek: printf(“%a”,3456.3423424);

Çıktı:0x1.b00af4780c811p+11

c verilen sayının ASCII tablosundaki karşılığı olan sembol ekrana basılır:

Örnek:printf(“%c”,69);

Çıktı:E

s verilen karakter dizisini bir dizgi (string) olarak ekrana basmaya yarar.

Örnek: char *k =”alibaba”;printf(“%s”, k);

Çıktı:alibaba

 

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir