Відповіді:
Ви можете використовувати зірочку ( *
) для передачі специфікатора / точності ширини 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
дзвінок.