Команда scan просматривает одновременно
строки string и format. Если очередной символ в строке format
— пробел или табуляция, то он соответствует любому числу (включая ноль) пробельных
символов (пробел, табуляция, новая строка) в строке string. Если в строке
format встретился символ ‘%’, он означает начало очередного спецификатора
преобразования. Спецификатор преобразования включает в себя до трех полей после
символа ‘%’: первое поле может содержать символ ‘*’, означающий,
что преобразуемая величина будет удалена, а не записана в очередную переменную,
второе поле может содержать число, указывающее максимальную ширину поля, и третье
поле содержит букву, определяющую тип преобразования. Обязательным является
только третье поле.
Когда команда scan находит спецификатор
преобразования в строке format, она пропускает пробельные символы в
строке string. Затем она выбирает следующую группу непробельных символов
и преобразует их в соответствии со спецификатором преобразования и записывает
результат в переменную, соответствующую следующему аргументу команды. Поддерживаются
следующие типы преобразований, задаваемые соответствующими символами:
d
Входное поле должно быть десятичным числом.
Результат записывается как десятичная строка.
o
Входное поле должно быть восьмеричным числом.
Результат преобразуется в десятичную строку.
x
Входное поле должно быть шестнадцатеричным
числом. Результат преобразуется в десятичную строку.
c
Читается один символ, его двоичная величина
преобразуется и записывается в переменную как десятичная строка. Начальные
пробельные символы в этом случае не пропускаются. В отличие от ANSI C процедуры
sscanf входное поле всегда состоит ровно из одного символа, а ширина
поля не может быть задана.
s
Входное поле состоит из всех непробельных символов
до следующего пробельного. Все символы копируются в переменную.
e или f или g
Входное поле должно быть числом с плавающей
точкой, состоящим из знака (не обязательно), строки десятичных цифр, возможно
с десятичной точкой и порядка (не обязательно), состоящего из буквы e
или E, знака порядка (не обязательно) и строки десятичных цифр.
[chars]
Входное поле состоит из произвольного числа
символов из chars. Соответствующая строка записывается в переменную.
Если первый символ в скобках ‘]’, то он рассматривается как часть
chars, а не как закрывающая скобка для множества символов
[^chars]
Входное поле состоит из произвольного числа
символов, не содержащихся в chars. Соответствующая строка записывается
в переменную. Если первый символ в скобках после ‘^’ есть ‘]’,
то он рассматривается как часть chars, а не как закрывающая скобка
для множества символов.
Число символов, которое выбирается для преобразования,
это максимально возможное число символов для соответствующего преобразования
(например, так много десятичных цифр, как это возможно для %d, или так
много восьмеричных цифр, как это возможно для %o). Поле, выбираемое для
очередного преобразования, закрывается, как только в строке string встречается
пробельный символ или как только поле достигает указанного максимального размера
(в зависимости от того, что происходит раньше). Если в спецификаторе преобразования
для очередного поля присутствует символ ‘*’, то выбранное значение не
присваивает никакой переменной, а очередной аргумент команды scan по-прежнему
считается неиспользованным.
Поведение команды scan не отличается от
поведения ANSI C процедуры sscanf за исключением следующих моментов:
[1]
Спецификаторы %p и %n не поддерживаются.
[2]
Для спецификатора %c нельзя указывать
ширину поля. Только один символ переводится в десятичную величину, которая
и присваивается соответствующей переменной.
[3]
Модификаторы l, h и L игнорируются.
Целые числа преобразуются так, как будто никакого модификатора не было задано,
а действительные числа — как при модификаторе l, то есть с использованием
типа double для внутреннего представления.