Acolchado de tamaño variable en printf

2 minutos de lectura

avatar de usuario
Egil

¿Hay alguna manera de tener un relleno de tamaño variable en printf?

Tengo un número entero que dice qué tan grande es el relleno:

void foo(int paddingSize) {
    printf("%...MyText", paddingSize);
}

Esto debería imprimirse ### MyText donde paddingSize debe decidir el número de símbolos ‘#’.

avatar de usuario
paxdiablo

Sí, si usas * en su cadena de formato, obtiene un número de los argumentos:

printf ("%0*d\n", 3, 5);

imprimirá “005”.

Tenga en cuenta que solo puede rellenar con espacios o ceros. Si desea rellenar con algo más, puede usar algo como:

#include <stdio.h>
#include <string.h>
int main (void) {
    char *s = "MyText";
    unsigned int sz = 9;
    char *pad = "########################################";
    printf ("%.*s%s\n", (sz < strlen(s)) ? 0 : sz - strlen(s), pad, s);
}

Esto produce ###MyText Cuándo sz es 9, o MyText Cuándo sz es 2 (sin relleno pero sin truncamiento). Es posible que desee agregar un cheque para pad siendo demasiado corto.

  • Lo siento, @Debanjan, me perdí uno de los * caracteres. La nueva versión ha sido revisada más a fondo.

    – pax diablo

    9 de noviembre de 2010 a las 12:40

  • ¿Por qué char *pad tiene que ser tan largo? Quiero decir, ¿no está limitado por la longitud final de la cadena de salida?

    – Snedden27

    8 oct 2020 a las 15:30

Podrías escribir así:

void foo(int paddingSize) {
       printf ("%*s",paddingSize,"MyText");
}

printf( "%.*s", paddingSize, string );

Por ejemplo:

const char *string = "12345678901234567890";
printf( "5:%.*s\n", 5, string );
printf( "8:%.*s\n", 8, string );
printf( "25:%.*s\n", 25, string );

muestra:

5:12345
8:12345678
25:12345678901234567890

mejor uso std::cout

using namespace std;
cout << setw(9)                       //set output width
     << setfill('#')                  // set fill character
     << setiosflags(ios_base::right)  //put padding to the left
     << "MyText";

debe producir:

###MyText

avatar de usuario
cflauta

Sin embargo, tenga cuidado: al menos algunos compiladores (y esto puede ser algo general de C) no siempre harán lo que usted quiere:

char *s = "four";
printf("%*.s\n", 5, s); // Note the "."

Esto imprime 5 espacios;

char *s = "four";
printf("%*s\n", 3, s);  // Note no "."

Esto imprime los cuatro caracteres “cuatro”

¿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