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