Я получил фрагмент кода, в котором есть утверждение
printf("%*.*s");
что означает %*.*s
?
Код
char *c="**********";
int i,n=4;
for(i=1;i<=n;i++)
{
printf("%*.*s\n",i,i,c);
}
Выход:
*
**
***
****
Я получил фрагмент кода, в котором есть утверждение
printf("%*.*s");
что означает %*.*s
?
Код
char *c="**********";
int i,n=4;
for(i=1;i<=n;i++)
{
printf("%*.*s\n",i,i,c);
}
Выход:
*
**
***
****
Прочтите спецификацию printf
:
%[flags][width][.precision][length]specifier
s
Строка символов
*
Ширина указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу.
Для строк ширина равна Минимальное количество печатаемых символов (можно добавить отступы).
.*
Точность указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу.
Для строк точность — это Максимальное количество печатаемых символов.
Ваша программа не передает необходимые необязательные аргументы (ширина, точность, строка для печати). Поведение будет неопределенным (вероятно, сбой).
Для начала позвольте мне пояснить, что символы *
в строке формата здесь не предназначены для печати самих символов *
. В этом контексте они имеют особое значение.
В твоем случае,
printf("%*.*s");
первое *
– это ширина поля, второе *
(точнее, .*
) обозначает точность.
Оба *
нуждаются в аргументе int
для предоставления соответствующего значения.
Чтобы процитировать стандарт,
Как отмечалось выше, ширина поля или точность, или и то и другое, могут быть обозначены звездочкой. В этом случае аргумент
int
указывает ширину или точность поля. Аргументы, определяющие ширину поля или точность, или и то, и другое, должны появляться (в указанном порядке) перед аргументом (если он есть), который нужно преобразовать. Аргумент отрицательной ширины поля принимается как флаг -, за которым следует положительная ширина поля. Отрицательный аргумент точности принимается, как если бы точность была опущена.
Таким образом, общая форма для отображения спецификатора преобразования выглядит следующим образом:
%[flags]<field width><precision><length modifier>[conversion specifier character]
Обратите внимание, что все элементы в <>
являются необязательными, только [flags]
и [conversion specifier character]
являются обязательными. Тем не менее, требование говорит
Ноль или более флажков
таким образом, по существу делая [flags]
необязательным.
Дополнительную информацию см. в стандарте C11
, глава §7.21.6.1.
Вам нужно передать 3 аргумента для этого оператора как printf("%*.*s",a,b,str);
, где a
и b
— целые числа, а str
— строка.
Он выводит a
количество символов, причем первые b
символов из str
являются последними b
символами вывода. Первые b-a
символов будут пробелами (' ').
.* Точность указывается не в строке формата, а в виде дополнительного аргумента целочисленного значения, предшествующего аргументу, который должен быть отформатирован.
printf("%.*s\n", 20, "раби");
printf()
будет потрачено не зря. В этом случае это также означает неправильно сформированный вызовprintf
, поскольку вы не предоставляете ни одного из обязательных аргументов для этого спецификатора формата в своем вызове. - person WhozCraig   schedule 19.06.2015