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 для внутреннего представления.
 
 
 
 
 
 
 


[ Список команд Tcl ]            [ Содержание ]