Г. Шилдт - Полный справочник по C++ (1109478), страница 37
Текст из файла (страница 37)
Для этого вместо точных зпачспий в спсцификаторс слсдуст указать символ +. При сканировании строки вывода функция рхапсд() поочередно сопоставляст модификатор * с каждым аргументом. Напримср, иа рис. 8.! показан вывод числа с чстырьмя цифрами после то ~ки в поле шири!юй (О символов.
В рсзультате па экран булст вывслсцо число 1гэ. З. Рис. 8. Е Сопоставление модификатора * с ега значениями Слсдуюшая программа иллюстрируст примеисиис модификаторов В и *. Вьпс1пг)е <ягг)1о. )г> ьпп па1п(чоЫ] ( рт1пг1("Ъх Вкх1п", 10, 10)г рт(ппг("а*.*1 , 10, Л, згЗЛ.За); тесьсп 0; Функция Всап$0 Фуикция всапв() представляет собой процедуру ввода. Она можст считывать лацные всех встроенных типов и автоматически преобразовывать числа в соответствуюший виугрсииий формат. Данная функция выглялит полной противоположностью функции рх1пьд(), Прототип функции всапд() имеет слсдуюший вид. 1пс Бс.пг (сопэс с)гат утгранляющггн юга~на, Функция всвпк() возврашает количество псрсмепиых, которым опа успешно присвоила свои значения.
Если при чтении произошла ошибка, функция всвпд() возврашает константу жор. Парамстр управляющая стирана определяет порядок считывания значений и присваивания их псремсниым, указанным в списке аргументов. Глава 8. Ввод-вывод иа консоль Управляющая строка состоит из символов, раздслешзых на три категории. ° Спсцификаторы формата. ° Разделители.
к Символы, не являюшисся разделителями. Рассмотрим каждую из этих категории. Спецификаторы формата Перел спсцификаторами форма~а стоит символ яь Они сообшают функции вовсе о тип данных, подлежащих вводу. Эти коды перечислены в табл. 8.3. Спецификаторы формата сопоставляются с аргументами слева направо. Рассмотрим несколько примеров. Таблица 3.3. Специфнкаторы формата функции всапЕ ( ) Код Символ Десятичное целое число со знаком Десятичное целое число со знаком, восьмеричное или шестнадцатеричное число Десятичное число с плавающей точкой Десятичное число с плавающей точкой Десятичное число с плавающей точкой Восьмеричное число Строка символов Десятичное целое число без знака Шестнадцатеричное число без знака (строчные буквы) Указатель Указатель на целочисленную переменную. Слецификатор вызывает лрисваиеа- нне этой целочисленной переменной количества символов, введенных перед ней Квбор сканируемых символов Знак ъ '4с ьс ъе ье в () Ввод чисел Взпстцбе <вкс)ьо.ц> Епк юасп(ъотс() ( Еос всапЕ("коЪх", ЬЕ, ЬЗ); ргспСЕ("ко Ъх", Е, б); Часть 1.
Основы языка С++: подмножество С Для ввода целого числа используются спсцификаторы ъб или ъьц Для ввода числа с плаваюшсй ~очкой, представленной в стандартном или нау шом формате, применяются спсцификаторы ве, ме или ззп. Используя спсцификаторы мо или ъх, можно вводить целые числа, представленные в яосьмсричном или шестнадцатеричном формате соответственно.
Спсцификатор мх имеет два варианта, предназначенных для ввода строчных и прописных шсстндцатсричных цифр от А до Г. Однако при вводе шестнадцатеричных чисел это не имеет значсния. Рассмотрим програлтму, выполнякядую ввод восьмеричного и шестнадцатеричного числа, Функция асане ( > прекращает вволить числа, обнаружив парный нечисловои символ. Ввод целых чисел без знака з)ля ввола целых чисел без знака применяется модификатор ъп.
Например, фрагмент ипв(дпег) гщпг всапг("Ъи", агщл); внолит целое число без знака и присваивает его переменной пша Ввод отдельных символов Как указывююсь ранее, о~дельные символы можно вводи~ь с помощью Функции денс)гатО или производных от нес функций. Функцию всапв О также можно применять лля этой цели, используя спсцификатор згс. Однако, как и Функция деестгат(), функция всапв(> использует буферизованный ввод, поэтому в юперактивных программах се применять нс следует. Несмотря на то что пробелы, знаки табуляции и символы перехода на новую строку используются как разделители при чтении ланных любых типов, при вводе отдельных символов они считываются наравне со всеми. Например, если поток ввода солсржит строку "х у", то Фрагмент кода $ всагт(нас%с%с", аа, 6)>, ас); присвоит символ х переменной а, пробел — переменной )з и символ у — переменной о. Ввод строк Функцию всапе(> можно применять для ввода строк из входного потока.
Для этого используется спсцификатор жв. Оц заставляет функцию есапвО считывать символы, пока не обнаружится разделитель. Символы, считанные из входного потока, записываются в массив, на который ссылается соответствуклций аргумент, а н конец этого массива записывается нулсвои баит. Функция всапвО считает разлелителем пробел, символ перехода на новую строку, символ табуляции, символ вертикальной табуляции, а также символ прогона бумаги. Следовательно, функцию всапв О нельзя просто применить для ввода строки "Это проверка", поскольку ввод прекратится на пергюы же пробеле. Чтобы увидеть эффект, произведенный спецификатором ъв, попробуй~с применить следующую программу к строке "Всем привет".
Мтпс1иг(е <вело.)т> (пе таза(чоЫ) ( с)гас вег(80) ргтпет("Введите строку: всапг("Ъв", втг); ргтпет("нот вака строка: Нв", ясх)г гегам 0; Программа вернет лишь слово "Всем", а остальную часть строки проигнорируе~. Глава 8. Ввад-вынод нв консоль Ввод адреса Для ввода адреса применяется спецификатор Ър. Он заставляет функцию всапЕ() с ~из ывать из входного потока адрес, формат которого определяется архитектурой цен- 1)хц)ьиого процессора. Например, следующая программа вводит адрес ячеики, а затем выводи~ па экран сс содержимое.
< $!пс1пс(е <вело.н> ' (пс та|с(ног<() ~! ( 1 *. снах *р; рхапсЕ("Введите адрес: "); всапЕ("Ър", гр); рхгпсЕ("га этому адресу хранится вначениеЪр Гв ксан", р. *р); хееихп 0; г ) Спецификатор %п Спсцификатор тзп вынуждает функцию всвпЕ() присвоить количество ранее введсннь(х символов переменной, на которую ссылается соответствующий аргумент. Использование набора сканируемых символов Функция всепЕ() поддерживает спсцификатор универсатьного формата, называемыи набором сканьруемых символов (зсапзе(). При обработке этого спецификагора функция будет вводить только те символы, которые входят в заданный набор.
Символы записываются в массив, на который ссылается соответствуюшии аргумент, Для того чтобы определить набор сканируемых символов, достаточно перечисли~ь их в квадратных скобках Перед открывающеи квадратной скобкой указывается символ процента. Наприл(ер, следующий набор сканируемых символов означает, что функция всепЕ() должна вводить лишь символы х, к и в. В Ь(ХУ2) При использовании набора сканяруемых символов функция всепе() продолжает снпывать символы, помещая их в соответствующий массив, пока нс обнаружи~ся символ, не входящии в заданный набор. По возврагцении из функции всепЕ() массив будет содержать строку, состоящую из считанных элементов и завершающуюся пулевым бантом.
Все вьицссказангюе иллюстрируется следующей программои. М хпсгпае <в Сото. Ь> )пс магп(уоуо) пс сцвх втх(80), вхх2(80); всепг("ВйЪ(е)>со(егд,ив', аь, вхх, всх2); рхьпсЕ("Ъ<) Ъв Ъв", х, всх, вех2)г хесин 0; твв Часть (. Основы языка С++: подмножество С Вводите строку 1ззаьеоеуо и нажми~с кяанищу <вьтвн>. Программа выведет па зкрап слсдукнцнс строки: 123 аней еуо. Поскольку символ е не входит в набор сканируемых символов, обнаружив сто, функция веапв() останавливает считывание да|шых из входного потока в переменную яех.
Оставшиеся символы считываются в псрсмс[пвло вех-2 Если первым символом набора является знак ", набор сканируемых символов трак[уется наоборот. Знак " сообшает функции вовне(), что она должна вводить только символы, не опрсдслепныс в наборе. В большинстве реализаций можно задавать диапазон символов, используя дефис. Например, слелуюший спсцификатор ог раничивает ввод символов диапазоном от в ло х $ в[в-х) Следует помнить, что набор сканируемых символов чувствителен к регистру. Лля того чтобы ввести как прописные, так и строчные буквы, их слслует указать отдслыю.
Пропуск нежелательных разделителей Если в управляю~лей строке задан раздслитслгч функция веапе () пропускает один или несколько разделителей во входном потоке. Разделителем может быть пробел, символ табуляции, символ вертикальной табуляции, символ прогона бумаги, а также символ перехода на новую строку.
По существу, один разделитель в управляющей строке заставляет функцию веков() считывать, но не записывать в память любое количество разделителей, стоящих перед первым символам, нс являющимся разлслителсм. Символы, не являющиеся разделителями Символы, не являющиеся разделителями, нынухдаюг функцию яеапе() с омывать и пропускать заданные символы.