Переменные размеры в printf - PullRequest
       9

Переменные размеры в printf

25 голосов
/ 09 ноября 2010

Есть ли способ иметь отступ переменного размера в printf?

У меня есть целое число, которое говорит, насколько велик отступ:

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

Это должно вывести ### MyText, где paddingSize должен определить количество символов '#'.

Ответы [ 4 ]

47 голосов
/ 09 ноября 2010

Да, если вы используете * в строке формата, он получает число из аргументов:

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

выведет «005».

Имейте в виду, что вы можететолько блок с пробелами или нулями.Если вы хотите дополнить что-то еще, вы можете использовать что-то вроде:

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

Это выводит ###MyText, когда sz равно 9, или MyText, когда sz равно 2 (без заполнения, нобез усечения).Вы можете добавить чек на pad слишком короткий.

1 голос
/ 09 ноября 2010

Вы можете написать так:

void foo(int paddingSize) {
       printf ("%*s",paddingSize,"MyText");
}
1 голос
/ 09 ноября 2010

Однако будьте осторожны - по крайней мере, некоторые компиляторы (а это может быть обычным C) не всегда будут делать то, что вы хотите:

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

Это печатает 5 пробелов;

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

Это печатает все четыре символа "четыре"

0 голосов
/ 09 ноября 2010
printf( "%.*s", paddingSize, string );

Например:

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

отображает:

5:12345
8:12345678
25:12345678901234567890
...