Описанная ниже строка формата, используется во многих функциях ввода данных (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*) |