Boşluklu sol yastık baskısı


114

Printf'i kullanırken bir dizeyi solda boşluklarla nasıl doldurabilirim?

Örneğin, önünde 40 boşluk olacak şekilde "Merhaba" yazmak istiyorum.

Ayrıca yazdırmak istediğim dize birden çok satırdan oluşuyor. Her satırı ayrı ayrı yazdırmam gerekir mi?

DÜZENLEME: Açık olmak gerekirse, her satırdan önce tam olarak 40 boşluk basılmasını istiyorum.

Yanıtlar:


125

"Merhaba" kelimesinin, sol tarafta boşluklar olacak şekilde 40 karakter genişliğindeki bir sütuna yazdırılmasını istiyorsanız, aşağıdakileri kullanın.

char *ptr = "Hello";
printf("%40s\n", ptr);

Bu size 35 boşluk ve ardından "Merhaba" kelimesini verecektir. Sütunun ne kadar geniş olmasını istediğinizi bildiğinizde işleri bu şekilde biçimlendirirsiniz, ancak veriler değişir (bunu yapmanın bir yolu budur).

Tam olarak 40 boşluk istediğinizi biliyorsanız, sonra bir metin, sadece 40 boşluğu sabit olarak kaydedin ve yazdırın. Birden çok satır yazdırmanız gerekiyorsa, ya printfyukarıdaki gibi birden çok ifade kullanın ya da ptrher seferinin değerini değiştirerek bunu bir döngü içinde yapın .


3
biçim bayrakları hakkında fazla bir şey bilmiyorum. ama printf ("% 40s% s \ n", "", ptr) olduğundan şüpheleniyorum; 40 boşluk doldurmak için de kullanılabilir mi?
Johannes Schaub -

Evet, bu size her zaman işaretçinin içeriğinden önce 40 boşluk verir. Bu güzel bir çözüm, ancak bunu çok yapmak zorunda kalırsanız 40 boşluklu bir sabit daha hızlı olur diye düşünüyorum. Derleyicinin printf formatlarını optimize edip edemediğini bilmiyorum.
Bill the Lizard

38
Ayrıca, dahil edilecek boşlukların sayısını içeren bir int değişkeniniz 'n' varsa, şunu kullanabilirsiniz: printf ("% * s% s \ n", n, "", ptr); değişken sayıda boşluk elde etmek için.
Jonathan Leffler

Ve, S'nin son bölümünü ele almak için: evet, verinin her satırının önde gelen 40 boşlukla yazdırılmasını istiyorsanız, o zaman verileri bölümlere ayırmanız gerekir, böylece her satır ayrı ayrı yazdırılır.
Jonathan Leffler

4
@Jonathan Leffler: Derleyici elbette printf formatlarını optimize edebilir. Örneğin, GCC printf ("% s \ n", foo) 'yu optimize eder ve onu puts (foo) ile değiştirir.
sam hocevar

73

Çıktımı girintilemek için bu işlevi kullanıyorum (örneğin bir ağaç yapısını yazdırmak için). indentDizesinin önce boşluk sayısıdır.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
Girintiyi printf biçiminin geri kalanından ayrı tutmak için dize değişmez birleştirme kullanımınızı seviyorum. Bir öneri: girinti dizesi için tek bir boşluk yerine boş bir dize kullanın. Bu şekilde indent == 0 beklendiği gibi çalışacaktır. (yani, printf(..., indent, "", ...))
ɲeuroburɳ

Not, Ray Hulha bir "derleyici sorununu" düzeltmek için dizge gerçek birleştirme işlemini kaldırmıştır.
mwfearnley

42
int space = 40;
printf("%*s", space, "Hello");

Bu ifade, 40 karakterlik bir satırı, satırın sonunda yazdırma dizesi ayırır (toplam satır uzunluğu 40'ta sabit olacak şekilde fazladan boşlukları kaldırır). Aynısı, aşağıdaki gibi karakterler ve tamsayılar için kullanılabilir:

printf("%*d", space, 10);
printf("%*c", space, 'x');

Boşlukları belirlemek için bir parametre kullanan bu yöntem, değişken sayıda boşluğun gerekli olduğu durumlarda kullanışlıdır. Bu ifadeler, aşağıdaki gibi tamsayı değişmez değerlerle çalışmaya devam edecektir:

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

Umarım bu, gelecekte benim gibi birine yardımcı olur.


Bende error: empty character constantiçin ''. Olması gerekmiyor ' 'mu?
Jin Kwon

Evet olmalı.
shjeff

@JinKwon herhangi bir karakter, tıpkı herhangi bir "Hello"şey olabileceği gibi, bir örnek kullanmalıydı
joe pelletier

18

Dizeden önce tam olarak 40 boşluk istiyorsanız, yapmanız gereken:

printf("                                        %s\n", myStr );

Bu çok kirliyse yapabilirsin (ancak 40 boşluğu elle yazmaktan daha yavaş olacaktır): printf("%40s%s", "", myStr );

Dizenin 40. sütunda sıralanmasını istiyorsanız (yani, en sağdaki karakter 40. sütunda olacak şekilde onu ilerleyen en fazla 39 boşluk bırakın), o zaman şunu yapın: printf("%40s", myStr);

Ayrıca şunu yaparak dizeden SONRA "en fazla" 40 boşluk koyabilirsiniz: printf("%-40s", myStr);


2
dizeden sonraki boşluklar için bu yorumu
beğenin
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.