Описаний нижче рядок формату використовується в багатьох функціях введення даних (scanf, fscanf, sscanf та ін.). Рядок може включати три види елементів:
- символи пробілів (пробіл ” “, табуляцію “\t”, символ нового рядка “\n”
- не пробільні друковані символи (крім %)
- специфікації формату
Якщо в рядку зустрівся пробільний символ, то з цього моменту пробільні символи до першого не пробільного символу зчитуються з вхідного потоку, але не беруть участь у привласненні змінних значень (ігноруються).
Якщо у рядку зустрівся друкований не пробіловий символ, то з цього моменту з вхідного потоку зчитується та ігнорується послідовність символів, що зустрілася у рядку формату. Якщо послідовність символів у вхідному потоці не відповідає записаному у рядку формату, форматування переривається.
Специфікації формату починаються з символу % і мають вигляд:
%, [*] [width] [FIN] [h|l|L] type
Усі символи специфікації записуються без пробілів між ними.
Єдино обов’язковим елементом специфікації є type – символ, що вказує на те, як трактуватиметься аргумент, що вводиться. Інші необов’язкові елементи задають параметри форматування:
Значення | Опис |
[*] | Заборона занесення в пам’ять поля, що читається. Поле сканується, але його значення не надається аргументу зі списку. |
[width] | Ширина поля – максимальна кількість символів, що читаються. Реально може бути прочитано менше символів, якщо у вхідному потоці раніше зустрінеться символ пробілу або символ, який не може бути перетворений відповідно до заданого формату. |
[F|N] | Модифікатори, які змінюють розмір аргументу за замовчанням: |
N | ближній вказівник (near) |
F | дальній вказівник (far) |
[h|l|L] | Модифікатори, які змінюють розмір аргументу за замовчанням: |
h | short int |
l | longint, якщо type відповідає цілій кількості, або double, якщо type відповідає дійсному числу |
L | long double |
Нижче наведено можливі значення type.
Символ | Очікуваний тип даних | Тип аргументу |
d | цілий | вказівник на int(int*arg) |
D | цілий | вказівник на long(long*arg) |
e, E | дійсний | вказівник на float(float*arg) |
f | дійсний | вказівник на float(float*arg) |
g, G | дійсний | вказівник на float(float*arg) |
o | вісімковий цілий | вказівник на int(int*arg) |
O | вісімковий цілий | вказівник на long(long*arg) |
i | десятковий , вісімковий або шістнацятковий цілий | вказівник на int(int*arg) |
I | десятковий , вісімковий або шістнацятковий цілий | вказівник на long(long*arg) |
u | десятковий цілій без знаку | вказівник на unsigned int (unsigned int *arg) |
U | десятковий цілій без знаку | вказівник на unsigned long (unsigned long *arg) |
x | шістнацятковий цілий | вказівник на int(int*arg) |
X | шістнацятковий цілий | вказівник на int(int*arg) |
Символи | ||
s | рядок символів | вказівник на масив символів (chararg[]) |
c | символ | вказівник на char(char*arg) або якщо задана ширина поля (наприклад, % 5с), то на масив символів розміром W(chararg[W]) |
% | символ % | не перетворюється |
Вказівники | ||
n | вказівник на int(int*arg) | у комірку пам’яті, на яку вказує аргумент, заноситься кількість успішно прочитаних до цього моменту символів |
P | шістнацятковий формат: YYYY:ZZZZили ZZZZ | покажчик на об’єкт (far* или near*) |