Çıktıda eşit uzunluk elde etmek için printf () kullanılarak dizeler nasıl biçimlendirilir


98

İki fonksiyonları gibi mesajlar üreten bir tane Starting initialization...ve kontrol kodları ve çıkışları geri dönme başka "Ok", "Warning"ya da "Error". Bununla birlikte, üretilen çıktı farklı uzunluktadır:

Starting initialization...Ok.
Checking init scripts...Ok.

Aşağıdaki gibi bir şeyi nasıl elde edebilirim?

Starting initialization...       Ok.
Checking init scripts...         Ok.

Yanıtlar:


165

Dize alanlarında bir genişlik belirtebilirsiniz, örneğin

printf("%-20s", "initialization...");

Ve sonra bu alanla yazdırılan her şey belirttiğiniz genişliğe kadar boş doldurulacaktır.

-Bu alanda metninizi sol haklı.


130
Ne yazık ki, bu kadar yüksek sayacak kadar zeki değilim. Ancak,
soruyu soranın

3
doğru gerekçelendirme ne olacak? K&R
Ungeheuer

9
Sağa yaslanmış varsayılandır. Bir olmadan -, verileriniz genişliğini belirttiğiniz bir alanda sağa yaslanır.
Carl Smotricz

25

printfgenişlik belirticileriyle biçimlendirmeye izin verir. Örneğin,

printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Sola yaslamayı belirtmek için negatif bir genişlik belirticisi kullanırsınız çünkü varsayılan, sağa yaslama kullanmaktır.


20

Ek olarak, seçim esnekliğini istiyorsanız, widthaşağıdaki iki formattan birini seçebilirsiniz (kesmeli veya kesmesiz):

int width = 30;
// No truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization...     Ok."

// Truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." );
// Output is "Starting initialization... Ok."

13

%nBelirli durumlarda yardımcı olabilecek değiştirici de var . Dizenin o ana kadar olduğu sütunu döndürür. Örnek: Bir tablo gibi ilk satırın genişliği içinde olan birkaç satır yazmak istiyorsunuz.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

ne uzunluğu iki dizeleri aynı genişlikte iki sütun yazdırır header1ve header2sahip olabilir. Tüm uygulamalarda var mı bilmiyorum %nama Solaris ve Linux var.


1
Bu çözüm işe yarıyor, ancak bunu alan ve koduna ekleyen herkes, bellek açıklarının ortaya çıkma riskinin farkında olmalıdır .
Matthew Cole

0

Mesajlarınızı sıraya dizmek için el ile boşluk eklemenin oldukça düşük teknolojili bir çözümü de var. Mesaj dizelerinize birkaç boşluk eklemenizi hiçbir şey engellemez.


-2

Sekmelerin kullanımıyla başlayın - karakter değiştirici \ t . Sabit bir konuma (sütunlar, terminal dili) ilerleyecektir.

Bununla birlikte, sütun genişliğinden daha fazla farklılık olması yardımcı olmuyor (doğru hatırlıyorsam 4 karakter).

Bunu düzeltmek için, sabit sayıda sekme kullanarak "Tamam / NOK" bilgilerinizi yazın (5? 6?, Deneyin). Sonra yeni satır atlamadan ( \ r ) dönün ve mesajınızı yazın.


6
Her zaman bir dizenin sekme durağından daha uzun olması ve dolayısıyla ortaya çıkan sekmenin ve metnin yanlış hizalanması tehlikesi vardır.
PP.

Pek değil ... önce sekmeli OK / NOK yaz, sonra / r, şimdi / n ifadesini yaz. İfade, OK / NOK'un üzerine yazabilir. Ama senin yolun çok daha iyi, olumsuz gerekçelendirmeyi bilmiyordum.
jpinto3912
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.