Ответы:
Вы можете использовать звездочку ( *) для передачи спецификатора / точности ширины printf()вместо жесткого кодирования в строку формата, т.е.
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_lenаргумент должен иметь тип int(или более узкий целочисленный тип, который будет повышен до int). Было бы ошибкой пройти long, size_tи т.д.
%s, - напечатать подстроку исходной строки. В этом случае использования strбудет указывать где-то внутри исходной строки (возможно, в начале) и str_lenуказать длину подстроки, которая должна быть напечатана.
Подробнее здесь .
целочисленное значение или
*указывающее минимальную ширину поля. Результат дополняется пробелами (по умолчанию), если требуется, слева, если выровнен по правому краю, или справа, если выровнен по левому краю. В случае использования * ширина задается дополнительным аргументом типа 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|
Я не думаю, что приведенный выше код верен, но (согласно этому описанию printf()) .*средства
Ширина не указывается в строке формата, а указывается как дополнительный аргумент целочисленного значения, предшествующий аргументу, который должен быть отформатирован. '
Так что это строка с допустимой шириной в качестве аргумента.
int(или его подмножеством), а не просто любым целым значением, например более интуитивным size_tили его возможными псевдонимами, например std::string::size_type. Это еще больше сбивает с толку, если учесть, что на указанной странице упоминается size_tодин из описателей поддерживаемого типа.
См .: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*Точность указывается не в строке формата, а как дополнительный аргумент целочисленного значения, предшествующий аргументу, который необходимо отформатировать.
sСтрока символов
printfпризыв.