Справочник по функциям С++. Подпрограммы классификации Подпрограммы преобразования
Скачать 3.41 Mb.
|
scanf----------------------------------------------------------------- Назначение Осуществляют форматный ввод из потока stdin Синтаксис int scanf(const char *format[,adress, ...]); Прототип в stdio.h Замечания scanf просматривает последовательность полей ввода (по одному символу за раз) из потока stdin. Затем каждое поле форматируется в соответствии со спецификацией формата, задаваемой для scanf в форматной строке, на которую указывает format. После форматирования введенных данных scanf запоминает их по адресу, который задается с помощью аргумента, следующего за format. Количество спецификаторов форматов и адресов должно соответствовать количеству полей ввода. Форматная строка Форматная строка, присутствующая в scanf и подобных ей функциях cscanf, fscanf, sscanf, vscanf, vfscanf и vsscanf, управляет вводом, преобразованием и запоминанием данных из полей ввода. При этом для заданных спецификаций формата должно быть достаточное количество адресных аргументов , в противном случае результат работы функции непредсказуем и может привести к катастрофическим последствиям. Лишние адресные аргументы (которым нет соответствующих форматов) просто игнорируются. Форматная строка является символьной строкой, которая содержит три типа объектов: неотобража- емые символы, отображаемые символы и специфика- ции формата. - Неотображаемыми символами являются пробел ( ), символ табуляции (\t) и символ перехода на новую строку (\n). Если функция ...scanf встречает неотображаемый символ в форматной строке, она будет считывать, но не сохранять всю последовательность символов вплоть до следующего отображаемого символа во входном потоке. - Отображаемыми символами являются все другие ASCII-символы за исключением символа процента (%). Если функция ...scanf встречает в строке форматов отображаемый символ, то она прочитает, но не сохранит соответствую- щий ему символ. - Спецификации формата предписывают функциям ...scanf осуществить чтение и преобразование символов из входного поля в значения определенного типа, затем запомнить их по адресу, указанному соответствующим адресным аргументом. Завершающий (последний) неотображаемый символ не читается (включая символ перехода на новую строку), если только он не описан явно в форматной строке. Спецификации формата. Спецификации формата функций ...scanf имеют следующий вид: % [*] [widht] [F|N] [h|l|L] символ_типа Спецификация каждого формата начинается с сим- вола процента(%). После этого символа следуют символы спецификации в следующем порядке: - необязательный символ подавления назначения[*] - необязательная спецификация ширины поля [width] - необязатальный модификатор размера указателя [F|N] - необязатальный модификатор типа аргумента [h|l|L] - символ типа Необязательные компоненты форматной строки Ниже представлено общее описание строки форматов в функциях ...scanf, управляющей формированием входного потока данных . ----------------------------------------------------------------- Символ или Чем управляет или что определяет спецификатор ----------------------------------------------------------------- * Отменяет присваивание следующего поля ввода width Максимальное число считываемых символов; меньшее количество символов может быть счи- тано в случае, если функция ...scanf встре- тит неотображаемый или непреобразуемый сим- вол. size Изменяет размер по умолчанию адресного аргумента. N = указатель типа near, F = указатель типа far argument Изменяет назначаемый по умолчанию тип адрес- type ного аргумента. h = тип short int l = тип long int (если символ типа указывает на преобразование к целому типу) l = тип double (если символ типа указывает на преобразование к типу c плавающей запятой) L = тип long double (допустим только при преобразованиях к типу c плавающей запятой) ----------------------------------------------------------------- Символы типа функций ...scanf. Следующая таблица содержит список символов типа, типы вход- ных данных, определяемых каждым из символов типа, и формат, в ко- тором эти введенные данные будут сохранены. Информация, приведенная в таблице, основана на предположе- нии, что спецификация формата не содержит необязательные символы, спецификаторы и модификаторы (*, widht или size). Для того, чтобы увидеть, как влияет использование необязательных элементов, обратитесь к таблице, следующей за данной. ----------------------------------------------------------------- Символ Ожидается на входе Тип аргумента типа ----------------------------------------------------------------- Числа d Десятичное целое Указатель на int (int *arg) D Десятичное целое Указатель на long (long *arg) о Восьмиричное целое Указатель на int (int *arg) O Восьмиричное целое Указатель на long (long *arg) i Десятичное, восьми- Указатель на int (int *arg) ричное или шестнад- цатиричное целое I Десятичное, восьми- Указатель на long (long *arg) ричное или шестнад- цатиричное целое u Десятичное целое Указатель на unsigned int без знака (unsigned int *arg) U Десятичное целое Указатель на unsigned long без знака (unsigned long *arg) x Шестнадцатиричное Указатель на int (int *arg) целое X Шестнадцатиричное Указатель на long (long *arg) целое e Число с плавающей Указатель на float запятой (float *arg) E Число с плавающей Указатель на float запятой (float *arg) f Число с плавающей Указатель на float запятой (float *arg) g Число с плавающей Указатель на float запятой (float *arg) G Число с плавающей Указатель на float запятой(float *arg) ----------------------------------------------------------------- Символы s Cтрока символов Указатель на массив символов (char arg[]) c Символ Указатель на символ (char *arg) Если ширина поля W задана вместе c символом типа (напри- мер %5c), то тип аргумента - указатель на массив из W сим- волов (char arg[W]) % Символ % Преобразование не осуществляется, символ % сохраняется ----------------------------------------------------------------- Указатели n Указатель на int (int *arg) Число успешно считанных символов запоминаются в этом целом. P Шестнадцатиричное Указатель на объект (far* число в виде или near*) YYYY:ZZZZ По умолчанию %p преобразова- или ZZZZ ние использует тип указателя, соответствующий модели памяти ----------------------------------------------------------------- Поля ввода Полями ввода могут быть: - все символы до следующего неотображаемого символа (не включая его); - все символы до первого непреобразуемого по указанной спецификации формата символа (например, числа "8" и "9" по восьмиричному формату); - n символов, где n - ширина поля. Соглашения Для некоторых спецификаций формата приняты определенные сог- лашения, которые обобщены ниже. %с преобразование По этой спецификации читается следующий символ, включая неотображаемый символ. Для пропуска одного неотображаемого символа и чтения следующего отображаемого символа используйте спецификацию %1s . %Wc преобразование (W = спецификация ширины поля) Адресный аргумент является указателем на массив символов; мас- сив состоит из W элементов (char arg[W]). %s преобразование Адресный аргумент является указателем на массив символов (сhar arg[]). Размер массива size должен быть не менее (n+1) байт, где n - длина строки s (в символах). Поле ввода завершается пробелом или символом перехода на новую строку (\n). Ограничитель строки (\0) автоматически добавляется в строку после считывания и хранится в последнем элементе массива. %[образец] преобразование Набор символов, заключенных в квадратные скобки, может вводиться по формату s. Адресный аргумент является указателем на массив символов (char arg[]). Квадратные скобки заключают в себя набор символов, определяе- мых как "образец", или множество допустимых символов, из кото- рых должна состоять вводимая строка (поле ввода). Если первым символом в скобках является символ (^), то вво- диться будут все ASCII-символы из входного потока, кроме зак- люченных в скобки. (Обычно сам символ (^) включается в набор допустимых входных символов, если он не встречается в скобках еще раз, не на первой позиции). Поле ввода является строкой, не разделенной неотображаемыми символами. Функция ...scanf считывает соответствующее поле ввода до первого символа, не являющегося элементом допустимого набора символов (или элементом инвертированного набора). Приведем два примера этого типа преобразования: %[abcd] - определяет, что входное поле должно состоять из символов a,b,c или d . %[^abcd]- определяет, что входное поле долхно состоять из любых символов, кроме a,b,c или d . Вы можете также использовать ограничитель диапазона символов (цифровых или буквенных) в наборе символов. Например, для выбора всех десятичных цифр вы должны определить набор символов следующим образом: %[0123456789] или тот же самый набор можно определить следующим образом: %[0-9] Для выбора алфавитно-цифровых символов вы можете использовать следующие краткие записи: %[A-Z] Выбирает все буквы верхнего регистра %[0-9A-Za-z] Выбирает все десятичные цифры и все буквы (верхнего и нижнего регистров) %[A-FT-Z] Выбирает все буквы верхнего регистра от A до F и от T до Z При определении диапазонов символов в наборах действуют следующие правила: - символ, предшествующий дефису (-), должен быть лексически меньшим, чем символ после дефиса. - дефис не должен быть ни первым, ни последним символом набора (в противном случае это означает, что ограничитель диапазона не задан ). - символы по обе стороны от дефиса должны быть граничными символами диапазона и не должны принадлежать другому диапазону. Ниже приводятся несколько примеров, в которых дефис обознача- ет только символ дефиса, а не диапазон между двумя символами: %[-+*/] Четыре арифметических действия %[z-a] Символы z,- и a %[+0-9-A-Z] Символы + и -, и диапазоны от 0 до 9 и от A до Z %[^-0-9+A-Z] Все символы, кроме + и -, а также кроме символов из диапазонов от 0 до 9 и от A до Z %e,%E,%f,%g,%С преобразования (с плавающей запятой) Числа с плавающей запятой во входном поле должны соответство- вать следующему общему формату: [+/-] ddddddddd [.] dddd [E|e] [+/-] ddd где: [элемент] обозначает, что "элемент" является необязательным элементом формата; ddd представляет собой десятичное, восьмиричное или шестнадцатиричное число. Кроме того, +INF, -INF, +NAN, -NAN распознаются как числа с плавающей запятой. Обратите внимание, что знак и большие буквы являются обязательными. %d,%i,%o,%x,%D,%I,%O,%X,%c,%n преобразования Указатели на символ без знака, целое без знака (unsigned int) или длинное целое без знака (unsigned long) могут быть исполь- зованы в любом преобразовании, где допускаются указатели на символ, целое и длинное целое. Символ подавления присваивания Символом подавления присваивания при вводе значений с по- мощью функции ...scanf является символ "звездочка" (*); его не следует путать с оператором косвенности языка Си (который также обозначается звездочкой). Если этот символ (*) следует в спецификации формата за сим- волом (%), то следующее входное поле будет считано, но не присво- ено следующему адресному аргументу. Предполагается, что подавляе- мые входные данные специфицируются символом типа, который следует за символом (*). Заключение об успешном сравнении литер с образцом и подавле- нии присваивания непосредственно сделать нельзя. Спецификаторы ширины Спецификатор ширины (n), десятичное целое число, задает мак- симальное количество символов, которые будут считаны из текущего поля ввода. Если входное поле содержит менее, чем n символов, функция ... scanf считывает вначале в этом поле все символы, а затем обраба- тывает следующее поле и спецификацию формата. Если неотображаемый или непреобразуемый символ встретился в пределах указаной ширины поля ввода, то функция считывает, преоб- разует и размещает по указанному адресу символы, находящиеся до неотображаемого или непреобразуемого символа, после чего функция обратится к следующей спецификации формата. Непреобразуемыми считаются те символы, которые не могут быть преобразованы в соответствии с указанной спецификацией (такие как, например, символы "8" или "9" для восьмиричного формата и "J" либо "K", если указан шестнадцатиричный или десятичный формат). ----------------------------------------------------------------- Спецификатор ширины Как ширина поля влияет на сохраняемые функцией данные ----------------------------------------------------------------- n до n символов будет считано, преоб- разовано и сохранено по адресу, указан- ному текущим адресным аргументом функ- ции ----------------------------------------------------------------- Модификаторы входного размера и типа аргументов Модификаторы входного размера (N и F) и модификаторы типа аргумента (h,l и L) оказывают влияние на интерпретацию функцией ...scanf соответствующих адресных аргументов arg[f]. F и N осуществляют замену установленного по умолчанию или объ- явленного размера аргумента arg. h,l и L указывают, какого типа входные данные (версии) будут использоваться (h=short, l=long, L=long double). Входные данные будут преобразованы в соответствии с указанным типом. Аргумент arg для этих входных данных должен указывать на объект соответствующего размера (объект типа short для спецификации %h, объект типа long или double для спецификации %l и объект типа long double для %L). ----------------------------------------------------------------- Модификатор Как влияет на преобразование ----------------------------------------------------------------- F Заменяет установленный по умолчанию или объявленный размер; arg интерпретируется как указатель типа far. N Заменяет установленный по умолчанию или объявленный размер; arg интерпретируется как указатель типа near; не может быть использован при проведении преобразований в огромной (huge) модели памяти. h Для d,i,o,u,x типов: преобразует ввод в тип short и сохраняет в объекте типа short; для D,I,O,U,X типов: не оказывает влияния для e,f,c,s,n,p типов: не оказывает влияния l Для d,i,o,u,x типов: преобразует ввод в тип long int и сохраняет в объекте типа long; для e,f,g типов: преобразует ввод в тип double и сохраняет в объекте типа double; для D,I,O,U,X типов: не оказывает влияния для c,s,n,p типов: не оказывает влияния L Для e,f,g типов: преобразует ввод в тип long double и сохраняет в объекте типа long double. L не оказывает влияния на другие форматы. ----------------------------------------------------------------- Когда ...scanf прекращает чтение потока данных. Функция ...scanf может прекратить чтение потока данных до того, как встретит обычный символ конца поля (неотображаемый сим- вол), или завершить свою работу по различным причинам. Функция ...scanf прекратит чтение и сохранение текущего поля и перейдет к следующему входному полю, если имеет место один из следующих случаев: - Символ подавления присваивания (*) следует за символом (%) в спецификации формата; текущее входное поле будет считано, но не сохранено. - Было считано width символов (width - спецификация ширины входного поля, положительное целое десятичное число в спе- цификации формата). - Следующий считанный символ не может быть преобразован в соответствии с текущим форматом (например, "А", если задан десятичный формат). - Следующий символ во входном поле не соответствует заданному множеству допустимых символов, указанному в образце (или соответствуюет инвертированному множеству допустимых символов). Когда функция ...scanf прекращает чтение текущего входного поля по одной из этих причин, следующий символ считается несчи- танным и будет первым символом следующего входного поля или пер- вым символом ввода для последующих операторов чтения данных. Функция ...scanf может завершить свою работу по следующим причинам: - Следующий символ во входном поле противоречит соответ- ствующему отображаемому символу в строке форматов. - Следующий символ во входном поле есть символ EOF. - Строка форматов исчерпана. Если последовательность символов, не являющаяся спецификаци- ей формата, встретилась в строке форматов, то она дожна быть сравнена с текущей последовательностью символов входного поля. При этом функция ...scanf будет осуществлять только чтение, но не сохранение совпадающих символов. Если при чтении входного поля встречается символ, не совпадающий с указанным, то он остается во входном поле как будто он никогда функцией не считывался. Возвращаемое Все функции ...scanf возвращают число успешно значение читанных, преобразованных и размещен- ных по указанным адресам входных полей; в возв- ращаемое значение не включается число считанных полей которые были считаны функцией, но не были ею сохранены. Если функция при чтении входного потока встре- чает признак конца файла, то она возвращает значение EOF. Если ни одно поле не было сохранено, функция возвращает значение 0. Переносимость scanf доступна в системах UNIX и совместима с ANSI C. Определена в книге Кернигана и Ритчи. См. также cscanf,fscanf,printf,sscanf,vfscanf,vscanf, vsscanf ----------------------------------------------------------------- |