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.

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.


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);
}

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.


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);


2
como este comentário para espaços após a string
— oneat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.