Söz Dizimi
printf format [arguments ...]
Açıklama
printf aracı, ilk argümandan sonrakileri biçim kontrolü altında biçimlendirir ve yazdırır. Biçim, üç tür nesne içeren bir karakter dizisidir: doğrudan standart çıktıya kopyalanan düz karakterler, dönüştürülerek standart çıktıya kopyalanan karakter kaçış dizileri ve her biri bir sonraki sıradaki argümanın yazdırılmasını sağlayan biçim belirteçleri.
İlk argümandan sonraki argümanlar, ilgili biçim c, b veya s ise karakter dizisi (string) olarak kabul edilir; aksi takdirde aşağıdaki uzantılarla birlikte bir C sabiti olarak değerlendirilir:
• Başta artı (+) veya eksi (-) işareti bulunmasına izin verilir. • Başta bulunan karakter tek veya çift tırnak ise, değer sonraki karakterin karakter kodudur.
Biçim karakter dizisi, argümanları karşılamak için gerektiği sıklıkta yeniden kullanılır. Fazladan biçim belirteçleri sıfır veya boş karakter dizisi (null string) ile değerlendirilir.
Karakter kaçış dizileri, uzantılarla birlikte ANSI X3.159-1989 (“ANSI C89”) standardında tanımlandığı gibi ters eğik çizgi (backslash) notasyonundadır. Karakterler ve anlamları aşağıdaki gibidir:
\a Bir
Her biçim belirteci, yüzde karakteri (``%'') ile başlar. Biçim belirtecinin geri kalan kısmı sırasıyla şunları içerir:
Aşağıdaki bayraklardan sıfır veya daha fazlası:
Değerin bir ``alternatif biçimde'' yazdırılması gerektiğini belirten bir `#' karakteri. b, c, d, s ve u biçimleri için bu seçeneğin hiçbir etkisi yoktur. o biçimleri için, çıktı karakter dizisinin ilk karakterini sıfır yapmaya zorlamak amacıyla sayının duyarlılığı artırılır. x (X) biçimi için, sıfır olmayan bir sonucun başına 0x (0X) karakter dizisi eklenir. a, A, e, E, f, F, g ve G biçimleri için, noktadan sonra hiçbir basamak gelmese bile sonuç her zaman bir ondalık nokta içerecektir (normalde, bu biçimlerin sonuçlarında bir ondalık nokta yalnızca noktadan sonra bir basamak gelirse görünür). g ve G biçimleri için, normalde yapılanın aksine, sonucun sonundaki sıfırlar kaldırılmaz;
Çıktının belirtilen alanda sola yaslanmasını belirten bir eksi `-' işareti;
İşaretli biçimler kullanılırken sayının önüne her zaman bir işaret konulması gerektiğini belirten bir `+' karakteri.
‘ ’ İşaretli bir biçimde pozitif bir sayıdan önce bir boşluk bırakılması gerektiğini belirten bir boşluk karakteri. Her ikisi de kullanılırsa, bir `+' boşluğu geçersiz kılar;
0 Boşlukla doldurma yerine sıfırla doldurma (zero-padding) kullanılması gerektiğini belirten bir sıfır 0' karakteri. Her ikisi de kullanılırsa, bir -' işareti `0' karakterini geçersiz kılar;
Alan Genişliği: Bir alan genişliğini belirten isteğe bağlı bir basamak dizisi; eğer çıktı karakter dizisi alan genişliğinden daha az bayta sahipse, alan genişliğini tamamlamak için soldan (veya sola yaslama göstergesi verilmişse sağdan) boşlukla doldurulur (başta gelen bir sıfırın bir bayrak olduğunu, ancak araya eklenmiş bir sıfırın alan genişliğinin bir parçası olduğunu unutmayın);
Duyarlılık: İsteğe bağlı bir nokta, ‘.’, ve ardından gelen, e ve f biçimleri için ondalık noktadan sonra görünecek basamak sayısını veya bir karakter dizisinden yazdırılacak maksimum bayt sayısını belirten bir duyarlılık veren isteğe bağlı bir basamak dizisi; basamak dizisi yoksa, duyarlılık sıfır kabul edilir;
Biçim: Kullanılacak biçim türünü belirten bir karakter (diouxXfFeEgGaAcsb karakterlerinden biri). Büyük harfli biçimlerin küçük harfli benzerlerinden tek farkı, çıktılarının tamamen büyük harflerden oluşmasıdır. Kayan noktalı (floating-point) biçim belirteçlerinin (fFeEgGaA) önüne, varsa ek duyarlılık kullanılmasını istemek için bir L eklenebilir.
Bir alan genişliği veya duyarlılık, bir basamak dizisi yerine ‘*’ olabilir. Bu durumda, bir argüman alan genişliğini veya duyarlılığı sağlar.
Biçim karakterleri ve anlamları şunlardır:
diouXx Argüman sırasıyla işaretli ondalık (d veya i), işaretsiz sekizlik (octal), işaretsiz ondalık veya işaretsiz onaltılık (hexadecimal) (X or x) olarak yazdırılır.
fF Argüman, ondalık noktadan sonraki d sayısının argüman için belirtilen duyarlılık değerine eşit olduğu `[-]ddd.ddd' biçiminde yazdırılır. Duyarlılık belirtilmemişse 6 basamak verilir; duyarlılık açıkça 0 ise hiçbir basamak ve ondalık nokta yazdırılmaz. Sonsuz (infinity) ve NaN değerleri sırasıyla ‘inf’ ve ‘nan’ olarak yazdırılır.
eE Argüman, ondalık noktadan önce bir basamağın bulunduğu ve noktadan sonraki basamak sayısının argüman için belirtilen duyarlılık değerine eşit olduğu ‘[-d.ddd±dd]’ biçiminde yazdırılır; duyarlılık belirtilmemişse 6 basamak üretilir. Sonsuz (infinity) ve NaN değerleri sırasıyla ‘inf’ ve ‘nan’ olarak yazdırılır.
gG Argüman, minimum alanda tam duyarlılık sağlayan f (F) veya e (E) biçimlerinden biriyle yazdırılır.
aA Argüman, onaltılık (hexadecimal) noktadan önce bir basamağın bulunduğu ve noktadan sonraki basamak sayısının argüman için belirtilen duyarlılık değerine eşit olduğu ‘[-h.hhh±pd]’ biçiminde yazdırılır; duyarlılık belirtilmemişse, argümanın tam çift duyarlıklı kayan noktalı (double-precision floating-point) gösterimini ifade etmek için yeterli basamak üretilir. Sonsuz (infinity) ve NaN değerleri sırasıyla ‘inf’ ve ‘nan’ olarak yazdırılır.
c Argümanın ilk baytı yazdırılır.
s Karakter dizisi (string) argümanındaki baytlar, sonuna ulaşılana veya duyarlılık belirtimi ile gösterilen bayt sayısına ulaşılana kadar yazdırılır; ancak duyarlılık 0 veya belirtilmemişse, karakter dizisinin tamamı yazdırılır.
b s ile aynıdır, ancak karakter dizisi argümanındaki ters eğik çizgi (backslash) notasyonuna sahip karakter kaçışlarını yorumlar. İzin verilen kaçış dizileri biraz farklıdır; sekizlik (octal) kaçışlar \num yerine \0num biçimindedir ve ek bir kaçış dizisi olan \c bu printf çağrısından sonraki çıktı üretimini durdurur.
n$ Çıktının argümana göre yeniden sıralanmasına olanak tanır.
% Bir `%' yazdırır; hiçbir argüman kullanılmaz.
Ondalık nokta karakteri, programın yerel ayarlarında (LC_NUMERIC kategorisi) tanımlanır.
Olmayan veya küçük bir alan genişliği hiçbir durumda bir alanın kırpılmasına (truncation) neden olmaz; doldurma işlemi yalnızca belirtilen alan genişliği gerçek genişliği aştığında gerçekleşir.
Bazı kabuklar (shells), bu araca benzer veya onunla aynı olan yerleşik (builtin) bir printf komutu sağlayabilir. builtin(1) kılavuz sayfasına başvurun.
Çıkış Durumu
printf aracı başarı durumunda 0 değeriyle, bir hata oluştuğunda ise >0 değeriyle çıkar.
Örnekler
"hello" karakter dizisini yazdırın:
$ printf "%s\n" hello
hello
Yukarıdaki ile aynıdır, ancak biçim karakter dizisinin tırnak içine alınmadığına ve bu nedenle
beklenen davranışı elde edemediğimize dikkat edin:
$ printf %s\n hello
hellon$
Yalnızca ilk argüman için işareti zorlayarak argümanları yazdırın:
$ printf "%+d\n%d\n%d\n" 1 -2 13
+1
-2
13
Yukarıdaki ile aynıdır, ancak tek biçim karakter dizisi üç argümana da uygulanacaktır:
$ printf "%+d\n" 1 -2 13
+1
-2
+13
Ondalık noktadan sonra yalnızca iki basamak kullanarak sayıyı yazdırın:
$ printf "%.2f\n" 31.7456
31.75
Uyumluluk
Sayısal biçimlerin bir basamakla başlamayan argümanlarını ilk karakterin ASCII koduna dönüştürmeye yönelik geleneksel BSD davranışı desteklenmemektedir.
Ayrıca Bakınız
builtin(1), echo(1), sh(1), printf(3)
Standartlar
printf komutunun IEEE Std 1003.2 (“POSIX.2”) belirtimi ile uyumlu olması beklenmektedir.
Geçmiş
printf komutu ilk olarak 4.3BSD-Reno sürümünde yer almıştır. Standart kütüphane fonksiyonu olan printf(3) temel alınarak tasarlanmıştır.
Dikkat Edilecek Hususlar
ANSI onaltılık (hexadecimal) karakter sabitleri kasıtlı olarak sunulmamıştır.
İlk karakter olarak bir tire ("-") yazdırmaya çalışmak, printf'in tireyi bir program argümanı olarak yorumlamasına neden olur. Biçimden önce -- kullanılmalıdır.
Eğer yerel ayarlar çoklu bayt (multibyte) karakterler içeriyorsa (UTF-8 gibi), c biçimi ile duyarlılığa sahip b ve s biçimleri beklendiği gibi çalışmayabilir.
Hatalar
Kayan noktalı (floating-point) sayılar ASCII'den kayan noktalı sayıya ve ardından tekrar eski haline dönüştürüldüğünden, kayan noktalı sayı duyarlılığı kaybolabilir. (Varsayılan olarak sayı, yazdırılmadan önce bir IEEE-754 çift duyarlıklı değerine dönüştürülür. L belirteci, donanım platformuna bağlı olarak ek duyarlılık sağlayabilir.)
Kaçış dizisi \000, karakter dizisi sonlandırıcısıdır (string terminator). b biçiminin argümanında yer aldığında, argüman \000 karakterinde kesilecektir.
Çoklu bayt (multibyte) karakterler biçim karakter dizilerinde tanınmaz (bu, yalnızca ‘%’ karakterinin bir çoklu bayt karakterin içinde yer alabildiği durumlarda sorun teşkil eder).