Impresión de la almohadilla izquierda con espacios

114

¿Cómo puedo rellenar una cadena con espacios a la izquierda cuando uso printf?

Por ejemplo, quiero imprimir "Hola" con 40 espacios antes.

Además, la cadena que quiero imprimir consta de varias líneas. ¿Necesito imprimir cada línea por separado?

EDITAR: Para que quede claro, quiero imprimir exactamente 40 espacios antes de cada línea.

titanio decoy
fuente

Respuestas:

125

Si desea que la palabra "Hola" se imprima en una columna de 40 caracteres de ancho, con espacios a la izquierda, utilice lo siguiente.

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

Eso le dará 35 espacios, luego la palabra "Hola". Así es como formatea las cosas cuando sabe qué tan ancha quiere la columna, pero los datos cambian (bueno, es una forma de hacerlo).

Si sabe que desea exactamente 40 espacios y luego algo de texto, simplemente guarde los 40 espacios en una constante e imprímalos. Si necesita imprimir varias líneas, utilice varias printfdeclaraciones como la anterior o hágalo en un bucle, cambiando el valor de ptrcada vez.

Bill el lagarto
fuente
3
No sé demasiado sobre las banderas de formato. pero sospecho que printf ("% 40s% s \ n", "", ptr); ¿Se puede usar para rellenarlo con 40 espacios también?
Johannes Schaub - litb
Sí, eso siempre le daría 40 espacios antes del contenido del puntero. Esa es una buena solución, pero si tienes que hacerlo mucho, creo que una constante con 40 espacios sería más rápida. No sé si el compilador puede optimizar los formatos printf.
Bill the Lizard
38
Además, si tiene una variable int 'n' que contiene el número de espacios a incluir, puede usar: printf ("% * s% s \ n", n, "", ptr); para obtener un número variable de espacios.
Jonathan Leffler
Y, para abordar la última parte de la Q: sí, si desea que cada línea de los datos se imprima con 40 espacios iniciales, entonces necesita segmentar los datos para que cada línea se imprima por separado.
Jonathan Leffler
4
@Jonathan Leffler: por supuesto, el compilador puede optimizar los formatos printf. Por ejemplo, GCC optimiza printf ("% s \ n", foo) y lo reemplaza con put (foo).
sam hocevar
73

Utilizo esta función para sangrar mi salida (por ejemplo, para imprimir una estructura de árbol). El indentes el número de espacios antes de la cadena.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}
jk_
fuente
7
Me gusta su uso de la concatenación literal de cadenas para mantener la sangría separada del resto del formato printf. Una sugerencia: use una cadena vacía en lugar de un solo espacio para la cadena de sangría. De esa forma sangría == 0 funcionará como se esperaba. (es decir, printf(..., indent, "", ...))
ɲeuroburɳ
Tenga en cuenta que Ray Hulha ha eliminado la concatenación literal de cadenas, evidentemente para solucionar un "problema del compilador".
mwfearnley
42
int space = 40;
printf("%*s", space, "Hello");

Esta declaración reservará una fila de 40 caracteres, imprimirá una cadena al final de la fila (eliminando espacios adicionales de modo que la longitud total de la fila sea constante en 40). Lo mismo se puede usar para caracteres y números enteros de la siguiente manera:

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

Este método que utiliza un parámetro para determinar espacios es útil cuando se requiere un número variable de espacios. Estas declaraciones seguirán funcionando con literales enteros de la siguiente manera:

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

Espero que esto ayude a alguien como yo en el futuro.

Rece Foc
fuente
Tengo error: empty character constantpor ''. ¿No debería serlo ' '?
Jin Kwon
Sí, debería.
shjeff
@JinKwon cualquier personaje, como "Hello"podría ser cualquier cosa, debería haber usado un ejemplo
joe pelletier
19

Si desea exactamente 40 espacios antes de la cadena, simplemente debe hacer:

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

Si eso está demasiado sucio, puede hacerlo (pero será más lento que escribir manualmente los 40 espacios): printf("%40s%s", "", myStr );

Si desea que la cadena se alinee en la columna 40 (es decir, que tenga hasta 39 espacios a continuación de manera que el carácter más a la derecha esté en la columna 40), haga esto: printf("%40s", myStr);

También puede poner "hasta" 40 espacios DESPUÉS de la cadena haciendo: printf("%-40s", myStr);

Plataforma improvisada
fuente
2
como este comentario para espacios después de la cadena
oneat