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.

Titaniumdecoy
źródło

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.

Bill the Lizard
źródło
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);
}
jk_
źródło
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.

Rece Foc
źródło
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);

SoapBox
źródło
2
jak ten komentarz dotyczący spacji po ciągu
jeden