mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

SCANF(3S)                                             SCANF(3S)

НАЗВАНИЕ 
        scanf, fscanf, sscanf - ввод с преобразованием по  фор-
        мату

СИНТАКСИС 
        #include 
        
        int scanf (format [, pointer] ...)
        char *format;
        
        int fscanf (stream, format [, pointer] ...)
        FILE *stream;
        char *format;
        
        int sscanf (s, format [, pointer] ...)
        char *s, *format;

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

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

        1.   Пробельные  символы (собственно пробел, табуляция,
             перевод строки, переход к новой странице), которые
             (за исключением двух описанных ниже случаев) вызы-
             вают чтение до следующего непробельного символа.

        2.   Обычный символ (не %), который должен совпадать со
             следующим символом потока ввода.

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

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

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

        %    Из потока ввода должен быть прочитан  единственный
             символ %; никаких присваиваний не выполняется.

        d    Из потока ввода должно быть прочитано целое  деся-
             тичное число; соответствующий аргумент должен быть
             указателем на целое.

        u    Из  потока ввода должно быть прочитано целое деся-
             тичное без знака; соответствующий аргумент  должен
             быть указателем на целое без знака.

        o    Из  потока ввода должно быть прочитано целое вось-
             меричное число;  соответствующий  аргумент  должен
             быть указателем на целое.

        x    Из  потока ввода должно быть прочитано целое шест-
             надцатеричное число; соответствующий аргумент дол-
             жен быть указателем на целое.

        i    Из потока ввода должно быть прочитано целое число;
             соответствующий аргумент должен быть указателем на
             целое. Значение числа вычисляется в соответствии с
             соглашениями языка C: префикс 0 обозначает восьме-
             ричное  число, префикс 0x - шестнадцатеричное, от-
             сутствие префикса - десятичное.

        n    Общее количество  символов  (включая  пробельные),
             прочитанных с начала выполнения функции, запомина-
             ется  в очередной переменной из списка аргументов.
             Из потока ввода ничего не читается.

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

        s    Из потока ввода должна быть прочитана цепочка сим-
             волов; соответствующий аргумент должен быть указа-
             телем на символьный массив достаточной длины, что-
             бы в нем поместились вводимые данные с завершающим
             пустым  символом \0, который добавляется автомати-
             чески. Признак конца входного  поля  -  пробельный
             символ.

        c    Из  потока ввода должен быть прочитан единственный
             символ; соответствующий аргумент должен быть  ука-
             зателем на символ. Обычный пропуск пробельных сим-
             волов  в  этом  случае не производится; для чтения
             ближайшего непробельного символа нужно задать спе-
             цификатор %1s. Если задана ширина поля,  то  соот-
             ветствующий  аргумент должен указывать на символь-
             ный массив; в этом случае вводится заданное  коли-
             чество символов.

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

        Кодам преобразований d, u, o, x, i может предшествовать
        символ l или h, означающий, что  соответствующий  аргу-
        мент  указывает на переменную типа long или short, а не
        int. Аналогично, кодам e,  f,  g  может  предшествовать
        символ l, означающий, что соответствующий аргумент ука-
        зывает  на  переменную типа double, а не float. Для ос-
        тальных кодов преобразований модификаторы l и h игнори-
        руются.

        Функция scanf завершается по концу файла, при  исчерпа-
        нии формата или при обнаружении в потоке ввода символа,
        противоречащего  формату. В последнем случае символ-на-
        рушитель остается непрочитанным в потоке ввода.

        Функция scanf возвращает число успешно введенных и пре-
        образованных величин; это число может оказаться  нулем,
        если  слишком рано обнаружилось несоответствие с форма-
        том. Если ввод закончился без конфликтов и преобразова-
        ний, результат равен EOF.

ПРИМЕРЫ 
        1. В результате вызова

             int  n;  float x;  char name[50];
             n = scanf("%d%f%s", &i, &x, name);

        при наличии во входном потоке символов

             25 54.32E-1 Bill

        будет присвоено: переменной n - значение 3,  переменной
        i  -  значение  25,  переменной x - значение 5.432, а в
        массив name будет занесено Bill\0.

        2. После вызова

             int  i,j;  float x;  char name[50];
             (void)scanf("%i%2d%f%*d %[0-9]", &j, &i, &x,name);

        при наличии во входном потоке символов

             011 56789 0123 56a72

        будет присвоено: переменной j - значение 9,  переменной
        i - значение 56, переменной x - значение 789., последо-
        вательность 0123 будет пропущена, а в массив name будет
        занесено 56\0. Если после этого вызова последует  вызов
        getchar [см. getc(3S)], то будет прочитан символ a.

        3. В результате вызова

             int i, j, s, e;  char name[50];
             (void)scanf("%i %i %n%s%n", &i, &j, &s, name, &e);

        при наличии во входном потоке

             0x11 0xy johnson

        будет присвоено: переменной i - значение 17, переменной
        j - значение 0, переменной s -  значение  6,  в  массив
        name будет занесено xy\0, а переменной e присвоено зна-
        чение 8. Таким образом, длина заполненной части массива
        name  равна  e  -  s  = 2. При следующим за этим вызове
        getchar [см. getc(3S)] будет прочитан пробел.

СМ. ТАКЖЕ 
        getc(3S),     printf(3S),     stdio(3S),    strtod(3C),
        strtol(3C).

ДИАГНОСТИКА 
        Описанные функции возвращают значение EOF при  исчерпа-
        нии  потока ввода, или число успешно введенных и преоб-
        разованных величин.

СЮРПРИЗЫ 
        Заключительные   пробельные  символы  (включая  перевод
        строки) остаются в потоке  ввода  непрочитанными,  если
        только они не были явно затребованы форматом.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк