Stampa pad sinistra con spazi


114

Come posso riempire una stringa con spazi a sinistra quando uso printf?

Ad esempio, voglio stampare "Hello" con 40 spazi che lo precedono.

Inoltre, la stringa che voglio stampare è composta da più righe. Devo stampare ogni riga separatamente?

EDIT: Giusto per essere chiari, voglio esattamente 40 spazi stampati prima di ogni riga.

Risposte:


125

Se desideri che la parola "Hello" venga stampata in una colonna larga 40 caratteri, con spazi riempiti a sinistra, utilizza quanto segue.

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

Questo ti darà 35 spazi, quindi la parola "Hello". Questo è il modo in cui formatti le cose quando sai quanto ampia vuoi la colonna, ma i dati cambiano (beh, è un modo per farlo).

Se sai che vuoi esattamente 40 spazi e poi del testo, salva i 40 spazi in una costante e stampali. Se hai bisogno di stampare più righe, usa più printfistruzioni come quella sopra o fallo in un ciclo, cambiando il valore di ptrogni volta.


3
non so troppo sui flag di formato. ma sospetto printf ("% 40s% s \ n", "", ptr); può essere utilizzato anche per riempirlo con 40 spazi?
Johannes Schaub - litb

Sì, questo ti darebbe sempre 40 spazi prima del contenuto del puntatore. È una bella soluzione, ma se devi farlo molto penso che una costante con 40 spazi sarebbe più veloce. Non so se il compilatore è in grado di ottimizzare i formati printf.
Bill the Lizard

38
Inoltre, se hai una variabile int 'n' che contiene il numero di spazi da includere, puoi usare: printf ("% * s% s \ n", n, "", ptr); per ottenere un numero variabile di spazi.
Jonathan Leffler

E, per indirizzare l'ultima parte della Q: sì, se vuoi che ogni riga dei dati venga stampata con 40 spazi iniziali, allora devi segmentare i dati in modo che ogni riga venga stampata separatamente.
Jonathan Leffler

4
@ Jonathan Leffler: ovviamente il compilatore può ottimizzare i formati printf. Ad esempio, GCC ottimizza printf ("% s \ n", foo) e lo sostituisce con put (foo).
sam hocevar

73

Uso questa funzione per indentare il mio output (ad esempio per stampare una struttura ad albero). Il indentè il numero di spazi prima della stringa.

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

7
Mi piace il tuo uso della concatenazione letterale stringa per mantenere il rientro separato dal resto del formato printf. Un suggerimento: usa una stringa vuota invece di un singolo spazio per la stringa di rientro. In questo modo indent == 0 funzionerà come previsto. (ovvero, printf(..., indent, "", ...))
ɲeuroburɳ

Nota, Ray Hulha ha rimosso la concatenazione letterale stringa, evidentemente per risolvere un "problema del compilatore".
mwfearnley

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

Questa istruzione riserverà una riga di 40 caratteri, stampando la stringa alla fine della riga (rimuovendo gli spazi extra in modo che la lunghezza totale della riga sia costante a 40). Lo stesso può essere utilizzato per caratteri e numeri interi come segue:

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

Questo metodo che utilizza un parametro per determinare gli spazi è utile quando è richiesto un numero variabile di spazi. Queste istruzioni continueranno a funzionare con i valori letterali interi come segue:

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

Spero che questo aiuti qualcuno come me in futuro.


Ho error: empty character constantper ''. Non dovrebbe essere ' '?
Jin Kwon

Sì, dovrebbe.
shjeff

@JinKwon qualsiasi personaggio, proprio come "Hello"potrebbe essere qualsiasi cosa, avrebbe dovuto usare un esempio
joe pelletier

18

Se vuoi esattamente 40 spazi prima della stringa, dovresti semplicemente fare:

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

Se è troppo sporco, puoi farlo (ma sarà più lento rispetto alla digitazione manuale dei 40 spazi): printf("%40s%s", "", myStr );

Se vuoi che la stringa sia allineata alla colonna 40 (cioè, hai fino a 39 spazi che la precedono in modo tale che il carattere più a destra sia nella colonna 40), allora fai questo: printf("%40s", myStr);

Puoi anche inserire "fino a" 40 spazi DOPO la stringa facendo: printf("%-40s", myStr);


2
come questo commento per spazi dopo la stringa
oneat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.