lenguaje - ¿Cómo formatear cadenas usando printf() para obtener la misma longitud en la salida?
sintaxis de printf y scanf (6)
Tengo dos funciones, una que produce mensajes como Starting initialization...
y otra que comprueba los códigos de retorno y las salidas "Ok"
, "Warning"
o "Error"
. Sin embargo, el resultado que se produce es de diferente duración:
Starting initialization...Ok.
Checking init scripts...Ok.
¿Cómo puedo obtener algo como esto?
Starting initialization... Ok.
Checking init scripts... Ok.
Además, si desea la flexibilidad de elegir el width
, puede elegir entre uno de los siguientes dos formatos (con o sin truncamiento):
int width = 30;
//no truncation uses %-*s
printf( "%-*s %s/n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization... Ok."
//truncated to the specified width uses %-.*s
printf( "%-.*s %s/n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization... Ok."
Comience con el uso de pestañas, el modificador de caracteres / t . Avanzará a una ubicación fija (columnas, jerga terminal). Sin embargo, no ayuda si hay diferencias de más del ancho de la columna (4 caracteres, si no recuerdo mal).
Para arreglarlo, escriba sus cosas "OK / NOK" usando un número fijo de pestañas (5? 6 ?, pruébelo), luego regrese ( / r ) sin forro nuevo, y escriba su mensaje.
Puede especificar el ancho en los campos de cadena, por ejemplo
printf("%-20s", "initialization...");
y todo lo que se imprime con ese campo se rellenará en blanco al ancho que indique.
The -
left justifica tu texto en ese campo.
También está el modificador %n
que puede ayudar en ciertas circunstancias. Devuelve la columna en la que estaba la cadena hasta el momento. Ejemplo: desea escribir varias filas que están dentro del ancho de la primera fila como una tabla.
int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|/n", header1, &width1, header2, &width2);
for(i=0; i<6; i++)
printf("|%*d|%*d|/n", width1, values[i][0], width2, values[i][1]);
imprimirá 2 columnas del mismo ancho de cualquier longitud que puedan tener las dos cadenas header1
y header2
. No sé si todas las implementaciones tienen %n
pero Solaris y Linux sí.
También existe la solución de conteo de baja tecnología que permite agregar espacios a mano para alinear sus mensajes. Nada le impide incluir algunos espacios finales en sus cadenas de mensajes.
printf
permite formatear con especificadores de ancho. p.ej
printf( "%-30s %s/n", "Starting initialization...", "Ok." );
Utilizaría un especificador de ancho negativo para indicar justificación a la izquierda porque el valor predeterminado es usar justificación a la derecha.