Подтвердить что ты не робот

Заполнение переменной размером в printf

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

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

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

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

4b9b3361

Ответ 1

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

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 слишком короткий.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

лучше использовать 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";

должен произвести:

###MyText