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.

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.


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

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.


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


2
como este comentario para espacios después de la cadena
oneat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.