Заполнение переменной размером в printf
Есть ли способ иметь заполнение переменной размера в printf
?
У меня есть целое число, в котором указано, насколько велик пробел:
void foo(int paddingSize) {
printf("%...MyText", paddingSize);
}
Это должно распечатать ### MyText
, где paddingSize должен определить количество символов "#".
Ответы
Ответ 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