2010-07-09 15 views
9

Estoy tratando de formatear algunas instrucciones printf para permitir niveles de indentación arbitrarios. Lo ideal es que quiera la siguiente salida donde "Uno", "Dos", etc. son marcadores de posición para mensajes de registro de longitud variable.Espacio de longitud variable utilizando printf

One 
Two 
    Three 
Two 
One 

estoy trabajando en el espaciamiento de longitud variable requerida para la sangría, y sé que puedo hacer lo siguiente:

printf("%*s", indent_level, ""); 

pero me pregunto si hay una manera de hacerlo sin la segunda cadena vacía arg.

Respuesta

16

puede simplemente pasar como un parámetro de lo que quiere Protocolo de impresión:

printf("%*s", indent_level + strlen(mystr), mystr); 
+0

Buena sugerencia, pero la cadena de salida también es de longitud variable: printf ("% * s% d,% d,% d,% s, CHARAS CONSTANTES,% p \ n", indent_level, "",. ..); Es un dolor determinar la longitud de esa cadena sin usar un buffer intermedio. – bvanvugt

+0

Solo debe conocer la duración del primer parámetro, p. podría usar printf ("% * d,% d, ...", indent_level, param1, ...) – adamk

+0

La primera vez que uso ese tipo de letra de printf, ¿puede explicar por qué está usando indent_level + strlen (mystr)? –

1

No se puede escribir un comentario, por alguna razón, lo que la publicación como un necro-respuesta por separado.

>> "Por supuesto, si el primer parámetro es también de longitud variable, entonces esto no va a funcionar para usted"

> Sí, ese es el caso; necesita ser capaz de manejar un valor numérico de como el primer parámetro.

Puede utilizar una cadena sin fondos

printf ("%*s%d", indent_level, "", decimal); 

con el fin de aplicar sangría decimales de longitud variable. Un poco torpe, pero funciona.

Cuestiones relacionadas