Druk z lewej strony ze spacjami


114

Jak mogę wypełnić ciąg spacjami po lewej stronie, używając printf?

Na przykład chcę wydrukować „Hello” z 40 spacjami przed nim.

Ponadto ciąg, który chcę wydrukować, składa się z wielu wierszy. Czy muszę drukować każdą linię osobno?

EDYCJA: Żeby było jasne, chcę wydrukować dokładnie 40 spacji przed każdym wierszem.

Odpowiedzi:


125

Jeśli chcesz, aby słowo „Hello” zostało wydrukowane w kolumnie o szerokości 40 znaków, ze spacjami po lewej stronie, użyj następującego.

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

To da ci 35 spacji, a następnie słowo „Hello”. W ten sposób formatujesz rzeczy, gdy wiesz, jak szeroka chcesz kolumna, ale dane się zmieniają (cóż, to jeden ze sposobów, w jaki możesz to zrobić).

Jeśli wiesz, że chcesz dokładnie 40 spacji, to trochę tekstu, po prostu zapisz 40 spacji w stałej i wydrukuj je. Jeśli chcesz wydrukować wiele wierszy, użyj wielu printfinstrukcji, takich jak ta powyżej, lub zrób to w pętli, zmieniając wartość za ptrkażdym razem.


3
nie wiem zbyt wiele o flagach formatu. ale podejrzewam printf ("% 40s% s \ n", "", ptr); można go również użyć do wypełnienia 40 spacjami?
Johannes Schaub - litb

Tak, to zawsze dawałoby 40 spacji przed zawartością wskaźnika. To fajne rozwiązanie, ale myślę, że gdybyś musiał to robić dużo, stała z 40 spacjami byłaby szybsza. Nie wiem, czy kompilator jest w stanie zoptymalizować formaty printf.
Bill the Lizard

38
Ponadto, jeśli masz zmienną int 'n', która zawiera liczbę spacji do uwzględnienia, możesz użyć: printf ("% * s% s \ n", n, "", ptr); aby uzyskać zmienną liczbę spacji.
Jonathan Leffler,

A jeśli chodzi o ostatnią część pytania Q: tak, jeśli chcesz, aby każdy wiersz danych był drukowany z 40 spacjami wiodącymi, musisz posegmentować dane tak, aby każdy wiersz był drukowany oddzielnie.
Jonathan Leffler,

4
@Jonathan Leffler: oczywiście kompilator może optymalizować formaty printf. Na przykład GCC optymalizuje printf ("% s \ n", foo) i zastępuje go puts (foo).
sam hocevar

73

Używam tej funkcji do wcięcia mojego wyniku (na przykład do wydrukowania struktury drzewa). Jest indentto liczba spacji przed łańcuchem.

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

7
Podoba mi się, że używasz konkatenacji ciągów znaków, aby oddzielić wcięcia od reszty formatu printf. Jedna sugestia: użyj pustego ciągu zamiast pojedynczej spacji dla ciągu wcięcia. W ten sposób indent == 0 będzie działać zgodnie z oczekiwaniami. (tj. printf(..., indent, "", ...))
ɲeuroburɳ

Zauważ, że Ray Hulha usunął konkatenację ciągów znaków, najwyraźniej w celu naprawienia „problemu z kompilatorem”.
mwfearnley

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

Ta instrukcja zarezerwuje wiersz z 40 znakami, wypisze łańcuch na końcu wiersza (usuwając dodatkowe spacje, tak aby całkowita długość wiersza była stała i wynosiła 40). To samo można zastosować do znaków i liczb całkowitych w następujący sposób:

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

Ta metoda wykorzystująca parametr do określenia przestrzeni jest przydatna, gdy wymagana jest zmienna liczba przestrzeni. Te instrukcje będą nadal działać z literałami całkowitymi w następujący sposób:

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

Mam nadzieję, że to pomoże komuś takiemu jak ja w przyszłości.


Dostałem error: empty character constantza ''. Nie powinno być ' '?
Jin Kwon

Tak, powinno.
shjeff

@JinKwybrał jakąkolwiek postać, tak jak "Hello"mogłoby być cokolwiek, powinien był użyć przykładu
joe pelletier

18

Jeśli chcesz dokładnie 40 spacji przed łańcuchem, powinieneś po prostu zrobić:

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

Jeśli to jest zbyt brudne, możesz to zrobić (ale będzie to wolniejsze niż ręczne wpisanie 40 spacji): printf("%40s%s", "", myStr );

Jeśli chcesz, aby ciąg był ustawiony w kolumnie 40 (to znaczy mieć do 39 spacji poprzedzających go tak, że skrajny prawy znak znajduje się w kolumnie 40), zrób to: printf("%40s", myStr);

Możesz także wstawić „do” 40 spacji ZA napisem, wykonując: printf("%-40s", myStr);


2
jak ten komentarz dotyczący spacji po ciągu
jeden
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.