Unix Man (Справочное руководство)


SCANF(3S)


SCANF(3S)

НАЗВАНИЕ


scanf, fscanf, sscanf - ввод с преобразованием по формату

СИНТАКСИС

include <stdio.h>

nt scanf (format [, pointer] ...) har *format;

nt fscanf (stream, format [, pointer] ...) ILE *stream; har *format;

nt sscanf (s, format [, pointer] ...) har *s, *format;

ОПИСАНИЕ


Функция scanf читает данные из стандартного потока ввода stdin. Функция fscanf читает данные из потока ввода, заданного аргументом stream. Функция sscanf читает цепочку символов с адресом s. Каждая из перечисленных функций вводит символы, интерпретирует их в соответствии с форматом и записывает по указанным адресам. Аргументами функций являются: format - формат, управляющий преобразованием, и pointers - указатели на области памяти, куда следует помещать результаты преобразований. Если для заданного формата не хватает указателей, результат непредсказуем; если же указателей слишком много, лишние просто игнорируются.

Формат обычно содержит спецификаторы преобразований, которые задают способ интерпретации вводимых данных. В формате могут содержаться:

  1. Пробельные символы (собственно пробел, табуляция, перевод строки, переход к новой странице), которые (за исключением двух описанных ниже случаев) вызывают чтение до следующего непробельного символа.
  2. Обычный символ (не %), который должен совпадать со следующим символом потока ввода.
  3. Спецификаторы преобразований, состоящие из символа %, необязательного символа подавления присваивания *, необязательного числа, задающего максимальную ширину поля в потоке ввода, необязательного символа l или h, указывающего размер переменной, получающей значение, а также кода преобразования.

Спецификатор задает способ преобразования текущего входного поля; результат присваивается переменной, на которую указывает соответствующий аргумент pointer, если не задано подавление присваивания. Подавление присваивания позволяет пропускать в потоке ввода отдельные поля. Поле в потоке ввода определяется как последовательность символов, не содержащая пробелов, которая либо ограничивается "неуместным" (в данном контексте) символом, либо определяется шириной, если она задана. Для всех преобразований, кроме [ и c, пробелы в начале поля игнорируются.

Код преобразования определяет способ интерпретации входного поля; соответствующий аргумент-указатель, как правило, должен иметь соответствующий тип. Для пропускаемых полей указатель не задается. Распознаются следующие коды преобразований:

% d u o x i n e, f, g s c [
Из потока ввода должен быть прочитан единственный символ %; никаких присваиваний не выполняется.
Из потока ввода должно быть прочитано целое десятичное число; соответствующий аргумент должен быть указателем на целое.
Из потока ввода должно быть прочитано целое десятичное без знака; соответствующий аргумент должен быть указателем на целое без знака.
Из потока ввода должно быть прочитано целое восьмеричное число; соответствующий аргумент должен быть указателем на целое.
Из потока ввода должно быть прочитано целое шестнадцатеричное число; соответствующий аргумент должен быть указателем на целое.
Из потока ввода должно быть прочитано целое число; соответствующий аргумент должен быть указателем на целое. Значение числа вычисляется в соответствии с соглашениями языка C: префикс 0 обозначает восьмеричное число, префикс 0x - шестнадцатеричное, отсутствие префикса - десятичное.
Общее количество символов (включая пробельные), прочитанных с начала выполнения функции, запоминается в очередной переменной из списка аргументов. Из потока ввода ничего не читается.

Из потока ввода должно быть прочитано число с плавающей точкой; оно представляет собой последовательность цифр с необязательным знаком, необязательной десятичной точкой и необязательным порядком; порядок обозначается буквой e или E, за которой может следовать +, - или пробел, а затем - целое число. Соответствующий аргумент должен быть указателем на переменную типа float.

Из потока ввода должна быть прочитана цепочка символов; соответствующий аргумент должен быть указателем на символьный массив достаточной длины, чтобы в нем поместились вводимые данные с завершающим пустым символом \0, который добавляется автоматически. Признак конца входного поля - пробельный символ.
Из потока ввода должен быть прочитан единственный символ; соответствующий аргумент должен быть указателем на символ. Обычный пропуск пробельных символов в этом случае не производится; для чтения ближайшего непробельного символа нужно задать спецификатор %1s. Если задана ширина поля, то соответствующий аргумент должен указывать на символьный массив; в этом случае вводится заданное количество символов.
Входные данные обрабатываются особым образом. За открывающей скобкой следует ряд символов, которые называются шаблоном сканирования, а затем закрывающая скобка; входное поле представляет собой максимальный участок потока ввода, состоящий исключительно из символов шаблона. Если первым символом шаблона является ^, это означает, что входное поле представляет собой максимальный участок потока ввода, содержащий любые символы кроме перечисленных в шаблоне. Шаблон сканирования записывается по определенным правилам. Несколько символов можно задать конструкцией первый-последний; таким образом, ряд [0123456789] можно изобразить как [0-9]. При использовании этого правила первый должен быть лексикографически меньше или равен последнему, иначе минус рассматривается как обычный символ шаблона. Минус рассматривается как обычный символ, если он находится на первом или на последнем месте в шаблоне. Если в шаблон нужно включить закрывающую скобку, то она должна быть самым первым символом шаблона (возможно, с предшествующим ^), в противном случае она рассматривается как ограничитель шаблона. Соответствующий этому спецификатору аргумент должен быть указателем на символьный массив достаточной длины, способный вместить читаемые данные вместе с ограничителем \0, добавляемым автоматически. Это преобразование считается завершившимся успешно, если из потока ввода выбран хотя бы один символ, соответствующий шаблону.
<


Начало  Назад  Вперед