Что означает "%. * S" в printf? - PullRequest
94 голосов
/ 26 октября 2011

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

printf("%.*s\n")

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

Ответы [ 4 ]

97 голосов
/ 26 октября 2011

Вы можете использовать звездочку (*), чтобы передать спецификатор ширины / точность в printf() вместо жесткого кодирования его в строку формата, т.е.

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}
12 голосов
/ 30 марта 2018

Подробнее здесь .

целочисленное значение или *, указывающее минимальную ширину поля.Результат дополняется пробелами (по умолчанию), если требуется, слева, когда выровнено по правому краю, или справа, если выровнено по левому краю.В случае использования * ширина определяется дополнительным аргументом типа int.Если значение аргумента является отрицательным, это приводит к указанному флагу и положительной ширине поля.(Примечание. Это минимальная ширина: значение никогда не усекается.)

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

Так что, если мы попробуем обе спецификации преобразования

#include <stdio.h>

int main() {
    int precision = 8;
    int biggerPrecision = 16;
    const char *greetings = "Hello world";

    printf("|%.8s|\n", greetings);
    printf("|%.*s|\n", precision , greetings);
    printf("|%16s|\n", greetings);
    printf("|%*s|\n", biggerPrecision , greetings);

    return 0;
}

, мы получим вывод:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|
12 голосов
/ 26 октября 2011

Я не думаю, что приведенный выше код является правильным, но (согласно этому описанию printf()) .* означает

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

Так что это строка с допустимой шириной в качестве аргумента.

10 голосов
/ 26 октября 2011

См .: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...