scan

Производит разбор строки в стиле процедуры sscanf.

СИНТАКСИС

      scan string format varName ?varName...?
    

ВВЕДЕНИЕ

Данная команда, подобно ANSI C процедуре sscanf, просматривает строку string, выбирает поля и преобразует их в соответствии с очередным спецификатором преобразования в строке format. Выбранные значения преобразуются обратно в строковый вид и последовательно записываются в переменные varName.

ПРОЦЕСС СКАНИРОВАНИЯ

Команда 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 по-прежнему считается неиспользованным.

ОТЛИЧИЯ ОТ ANSI SSCANF

Поведение команды scan не отличается от поведения ANSI C процедуры sscanf за исключением следующих моментов:

[1] Спецификаторы %p и %n не поддерживаются.
[2] Для спецификатора %c нельзя указывать ширину поля. Только один символ переводится в десятичную величину, которая и присваивается соответствующей переменной.
[3] Модификаторы l, h и L игнорируются. Целые числа преобразуются так, как будто никакого модификатора не было задано, а действительные числа - как при модификаторе l, то есть с использованием типа double для внутреннего представления.