<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN> <html> <head> <title>scan</title> </head> <body> <h1>scan</h1> <p>Производит разбор строки в стиле процедуры <strong>sscanf</strong>.</p> <h2>СИНТАКСИС</h2> <pre> <strong>scan</strong> <em>string</em> <em>format</em> <em>varName</em> ?<em>varName</em>...? </pre> <h2>ВВЕДЕНИЕ</h2> <p>Данная команда, подобно ANSI C процедуре <strong>sscanf</strong>, просматривает строку <em>string</em>, выбирает поля и преобразует их в соответствии с очередным спецификатором преобразования в строке <em>format</em>. Выбранные значения преобразуются обратно в строковый вид и последовательно записываются в переменные <em>varName</em>.</p> <h2>ПРОЦЕСС СКАНИРОВАНИЯ</h2> <p>Команда <strong>scan</strong> просматривает одновременно строки <em>string</em> и <em>format</em>. Если очередной символ в строке <em>format</em> пробел или табуляция, то он соответствует любому числу (включая ноль) пробельных символов (пробел, табуляция, новая строка) в строке <em>string</em>. Если в строке <em>format</em> встретился символ <strong>%</strong>, он означает начало очередного спецификатора преобразования. Спецификатор преобразования включает в себя до трех полей после символа <strong>%</strong>: первое поле может содержать символ <strong>*</strong>, означающий, что преобразуемая величина будет удалена, а не записана в очередную переменную, второе поле может содержать число, указывающее максимальную ширину поля, и третье поле содержит букву, определяющую тип преобразования. Обязательным является только третье поле.</p> <p>Когда команда <strong>scan</strong> находит спецификатор преобразования в строке <em>format</em>, она пропускает пробельные символы в строке <em>string</em>. Затем она выбирает следующую группу непробельных символов и преобразует их в соответствии со спецификатором преобразования и записывает результат в переменную, соответствующую следующему аргументу команды. Поддерживаются следующие типы преобразований, задаваемые соответствующими символами:</p> <dl> <dt><strong>d</strong></dt> <dd>Входное поле должно быть десятичным числом. Результат записывается как десятичная строка.</dd> <dt><strong>o</strong></dt> <dd>Входное поле должно быть восьмеричным числом. Результат преобразуется в десятичную строку.</dd> <dt><strong>x</strong></dt> <dd>Входное поле должно быть шестнадцатеричным числом. Результат преобразуется в десятичную строку.</dd> <dt><strong>c</strong></dt> <dd>Читается один символ, его двоичная величина преобразуется и записывается в переменную как десятичная строка. Начальные пробельные символы в этом случае не пропускаются. В отличие от ANSI C процедуры <strong>sscanf</strong> входное поле всегда состоит ровно из одного символа, а ширина поля не может быть задана.</dd> <dt><strong>s</strong></dt> <dd>Входное поле состоит из всех непробельных символов до следующего пробельного. Все символы копируются в переменную.</dd> <dt><strong>e</strong> или <strong>f</strong> или <strong>g</strong></dt> <dd>Входное поле должно быть числом с плавающей точкой, состоящим из знака (не обязательно), строки десятичных цифр, возможно с десятичной точкой и порядка (не обязательно), состоящего из буквы <strong>e</strong> или <strong>E</strong>, знака порядка (не обязательно) и строки десятичных цифр.</dd> <dt><strong>[<em>chars</em>]</strong></dt> <dd>Входное поле состоит из произвольного числа символов из <em>chars</em>. Соответствующая строка записывается в переменную. Если первый символ в скобках <strong>]</strong>, то он рассматривается как часть <em>chars</em>, а не как закрывающая скобка для множества символов.</dd> <dt><strong>[^<em>chars</em>]</strong></dt> <dd>Входное поле состоит из произвольного числа символов, не содержащихся в <em>chars</em>. Соответствующая строка записывается в переменную. Если первый символ в скобках после <strong>^</strong> есть <strong>]</strong>, то он рассматривается как часть <em>chars</em>, а не как закрывающая скобка для множества символов.</dd> </dl> <p>Число символов, которое выбирается для преобразования, это максимально возможное число символов для соответствующего преобразования (например, так много десятичных цифр, как это возможно для <strong>%d</strong>, или так много восьмеричных цифр, как это возможно для <strong>%o</strong>). Поле, выбираемое для очередного преобразования, закрывается, как только в строке <em>string</em> встречается пробельный символ или как только поле достигает указанного максимального размера (в зависимости от того, что происходит раньше). Если в спецификаторе преобразования для очередного поля присутствует символ <strong>*</strong>, то выбранное значение не присваивает никакой переменной, а очередной аргумент команды <strong>scan</strong> по-прежнему считается неиспользованным.</p> <h2>ОТЛИЧИЯ ОТ ANSI SSCANF</h2> <p>Поведение команды <strong>scan</strong> не отличается от поведения ANSI C процедуры <strong>sscanf</strong> за исключением следующих моментов:</p> <table> <tr> <td>[1]</td> <td>Спецификаторы <strong>%p</strong> и <strong>%n</strong> не поддерживаются.</td> </tr> <tr> <td>[2]</td> <td>Для спецификатора <strong>%c</strong> нельзя указывать ширину поля. Только один символ переводится в десятичную величину, которая и присваивается соответствующей переменной.</td> </tr> <tr> <td>[3]</td> <td>Модификаторы <strong>l</strong>, <strong>h</strong> и <strong>L</strong> игнорируются. Целые числа преобразуются так, как будто никакого модификатора не было задано, а действительные числа - как при модификаторе <strong>l</strong>, то есть с использованием типа <strong>double</strong> для внутреннего представления.</td> </tr> </table> </body> </html>