Impressão com bloco esquerdo com espaços

114

Como posso preencher uma string com espaços à esquerda ao usar printf?

Por exemplo, quero imprimir "Olá" com 40 espaços antes dele.

Além disso, a string que desejo imprimir consiste em várias linhas. Eu preciso imprimir cada linha separadamente?

EDIT: Só para ficar claro, eu quero exatamente 40 espaços impressos antes de cada linha.

titaniumdecoy
fonte

Respostas:

125

Se você quiser que a palavra "Hello" seja impressa em uma coluna com 40 caracteres de largura, com espaços preenchidos à esquerda, use o seguinte.

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

Isso lhe dará 35 espaços e, em seguida, a palavra "Olá". É assim que você formata as coisas quando sabe a largura da coluna, mas os dados mudam (bem, é uma maneira de fazer isso).

Se você sabe que deseja exatamente 40 espaços e depois algum texto, basta salvar os 40 espaços em uma constante e imprimi-los. Se você precisar imprimir várias linhas, use várias printfinstruções como a acima ou faça isso em um loop, alterando o valor deptr cada vez.

Bill the Lizard
fonte
3
não sei muito sobre sinalizadores de formato. mas suspeito de printf ("% 40s% s \ n", "", ptr); pode ser usado para preenchê-lo com 40 espaços também?
Johannes Schaub - litb
Sim, isso sempre forneceria 40 espaços antes do conteúdo do ponteiro. Essa é uma boa solução, mas se você tiver que fazer muito acho que uma constante com 40 espaços seria mais rápida. Não sei se o compilador é capaz de otimizar os formatos de printf.
Bill the Lizard
38
Além disso, se você tiver uma variável int 'n' que contém o número de espaços a serem incluídos, você pode usar: printf ("% * s% s \ n", n, "", ptr); para obter um número variável de espaços.
Jonathan Leffler
E, para abordar a última parte do Q: sim, se você quiser que cada linha dos dados seja impressa com 40 espaços iniciais, você precisa segmentar os dados para que cada linha seja impressa separadamente.
Jonathan Leffler
4
@Jonathan Leffler: é claro que o compilador pode otimizar os formatos do printf. Por exemplo, o GCC otimiza printf ("% s \ n", foo) e o substitui por puts (foo).
sam hocevar
73

Eu uso esta função para recuar minha saída (por exemplo, para imprimir uma estrutura de árvore). O indenté o número de espaços antes da string.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}
jk_
fonte
7
Gosto do seu uso de concatenação literal de string para manter o recuo separado do resto do formato printf. Uma sugestão: use uma string vazia em vez de um único espaço para a string de indentação. Dessa forma, indent == 0 funcionará como esperado. (ie, printf(..., indent, "", ...))
ɲeuroburɳ
Nota, Ray Hulha removeu a concatenação literal da string, evidentemente para corrigir um "problema do compilador".
mwfearnley 01 de
42
int space = 40;
printf("%*s", space, "Hello");

Esta instrução reservará uma linha de 40 caracteres, imprimirá a string no final da linha (removendo espaços extras de forma que o comprimento total da linha seja constante em 40). O mesmo pode ser usado para caracteres e inteiros da seguinte maneira:

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

Este método que usa um parâmetro para determinar espaços é útil quando um número variável de espaços é necessário. Essas instruções ainda funcionarão com literais inteiros da seguinte maneira:

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

Espero que isso ajude alguém como eu no futuro.

Rece Foc
fonte
Eu tenho error: empty character constantpara ''. Não deveria ser ' '?
Jin Kwon
Sim, deveria.
shjeff
@JinK ganhou qualquer personagem, assim como "Hello"poderia ser qualquer coisa, ele deveria ter usado um exemplo
joe pelletier
18

Se você quiser exatamente 40 espaços antes da string, você deve apenas fazer:

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

Se estiver muito sujo, você pode fazer (mas será mais lento do que digitar manualmente os 40 espaços): printf("%40s%s", "", myStr );

Se você deseja que a string seja alinhada na coluna 40 (ou seja, tenha até 39 espaços precedendo-o de forma que o caractere mais à direita esteja na coluna 40), faça o seguinte: printf("%40s", myStr);

Você também pode colocar "até" 40 espaços APÓS a string, fazendo: printf("%-40s", myStr);

SoapBox
fonte
2
como este comentário para espaços após a string
oneat