Что означает printf(%*.*s,int,int,char *) в c?

Я получил фрагмент кода, в котором есть утверждение

printf("%*.*s");

что означает %*.*s?

Код

char *c="**********";
int i,n=4;
for(i=1;i<=n;i++)
{
printf("%*.*s\n",i,i,c);
}

Выход:

*
**
***
****

person Aishwarya V    schedule 19.06.2015    source источник
comment
Это означает, что некоторое время на таблицу форматирования для printf() будет потрачено не зря. В этом случае это также означает неправильно сформированный вызов printf, поскольку вы не предоставляете ни одного из обязательных аргументов для этого спецификатора формата в своем вызове.   -  person WhozCraig    schedule 19.06.2015
comment
флаги, ширина, .precision и модификаторы (в указанном порядке) являются необязательными. В вашем случае: ширина: * = ширина указывается не в строке формата, а как дополнительный аргумент целочисленного значения, предшествующий аргументу, который должен быть отформатирован. .precision: .* = Точность указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу. спецификатор: s = char* ссылка: cplusplus.com/reference/cstdio/printf   -  person Gwny    schedule 19.06.2015
comment
Также см.: stackoverflow.com/questions/23776824/   -  person P.P    schedule 19.06.2015


Ответы (4)


Прочтите спецификацию printf:

%[flags][width][.precision][length]specifier

s Строка символов

* Ширина указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу.

Для строк ширина равна Минимальное количество печатаемых символов (можно добавить отступы).

.* Точность указывается не в строке формата, а как дополнительный целочисленный аргумент, предшествующий форматируемому аргументу.

Для строк точность — это Максимальное количество печатаемых символов.

Ваша программа не передает необходимые необязательные аргументы (ширина, точность, строка для печати). Поведение будет неопределенным (вероятно, сбой).

person Remus Rusanu    schedule 19.06.2015

Для начала позвольте мне пояснить, что символы * в строке формата здесь не предназначены для печати самих символов *. В этом контексте они имеют особое значение.


В твоем случае,

 printf("%*.*s");

первое * – это ширина поля, второе * (точнее, .*) обозначает точность.

Оба * нуждаются в аргументе int для предоставления соответствующего значения.

Чтобы процитировать стандарт,

Как отмечалось выше, ширина поля или точность, или и то и другое, могут быть обозначены звездочкой. В этом случае аргумент int указывает ширину или точность поля. Аргументы, определяющие ширину поля или точность, или и то, и другое, должны появляться (в указанном порядке) перед аргументом (если он есть), который нужно преобразовать. Аргумент отрицательной ширины поля принимается как флаг -, за которым следует положительная ширина поля. Отрицательный аргумент точности принимается, как если бы точность была опущена.

Таким образом, общая форма для отображения спецификатора преобразования выглядит следующим образом:

 %[flags]<field width><precision><length modifier>[conversion specifier character]

Обратите внимание, что все элементы в <> являются необязательными, только [flags] и [conversion specifier character] являются обязательными. Тем не менее, требование говорит

Ноль или более флажков

таким образом, по существу делая [flags] необязательным.

Дополнительную информацию см. в стандарте C11, глава §7.21.6.1.

person Sourav Ghosh    schedule 19.06.2015

Вам нужно передать 3 аргумента для этого оператора как printf("%*.*s",a,b,str);, где a и b — целые числа, а str — строка.

Он выводит a количество символов, причем первые b символов из str являются последними b символами вывода. Первые b-a символов будут пробелами (' ').

person vinayawsm    schedule 19.06.2015

.* Точность указывается не в строке формата, а в виде дополнительного аргумента целочисленного значения, предшествующего аргументу, который должен быть отформатирован.

printf("%.*s\n", 20, "раби");

person rabi shaw    schedule 19.06.2015