Cómo formatear cadenas usando printf() para obtener la misma longitud en la salida

3 minutos de lectura

avatar de usuario
psicodelia

Tengo dos funciones, una que produce mensajes como Starting initialization... y otro que verifica códigos de retorno y salidas "Ok", "Warning" o "Error". Sin embargo, la salida que se produce es de diferente longitud:

Starting initialization...Ok.
Checking init scripts...Ok.

¿Cómo puedo obtener algo como lo siguiente?

Starting initialization...       Ok.
Checking init scripts...         Ok.

avatar de usuario
carl smotricz

Puede especificar un ancho en los campos de cadena, por ejemplo

printf("%-20s", "initialization...");

Y luego, lo que esté impreso con ese campo se rellenará en blanco al ancho que indique.

los - justifica a la izquierda su texto en ese campo.

  • Por desgracia, no soy lo suficientemente inteligente como para contar tan alto. Sin embargo, confío en que el autor de la pregunta sea lo suficientemente inteligente como para extrapolar mi ejemplo 🙂

    -Carl Smotricz

    27 de noviembre de 2009 a las 16:03

  • ¿Qué pasa con la derecha justificada? No hay ninguna bandera mencionada en K&R

    – Ungeheuer

    30/03/2017 a las 18:35


  • Justificado a la derecha es el predeterminado. Sin un -sus datos estarán justificados a la derecha en un campo cuyo ancho haya especificado.

    -Carl Smotricz

    3 abr 2017 a las 18:12

avatar de usuario
PÁGINAS.

printf permite formatear con especificadores de ancho. Por ejemplo,

printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Usaría un especificador de ancho negativo para indicar la justificación a la izquierda porque el valor predeterminado es usar la justificación a la derecha.

avatar de usuario
Balance de vida

Además, si desea la flexibilidad de elegir el widthpuede elegir entre uno de los dos formatos siguientes (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."

avatar de usuario
patricio schlüter

También está el %n modificador 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á dos columnas del mismo ancho de cualquier longitud de las dos cadenas header1 y header2 puede tener. No sé si todas las implementaciones tienen el %npero Solaris y Linux lo hacen.

También existe la solución de baja tecnología de contar espacios a mano para alinear sus mensajes. Nada le impide incluir algunos espacios finales en las cadenas de mensajes.

avatar de usuario
Pedro Mortensen

Comience con el uso de pestañas – los \t modificador de carácter Avanzará a una ubicación fija (columnas, jerga terminal).

Sin embargo, no ayuda si hay diferencias de más del ancho de columna (4 caracteres, si no recuerdo mal).

Para arreglar eso, escribe tus cosas “OK/NOK” usando un número fijo de pestañas (5? 6?, pruébalo). Luego regresa (\r) sin líneas nuevas y escriba su mensaje.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad