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.