Форматный ввод - функция SCANF

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

7.4. Форматный ввод - функция SCANF

Осуществляющая ввод функция SCANF является аналогом

PRINTF и позволяет проводить в обратном направлении многие

из тех же самых преобразований. Функция

 

SCANF(CONTROL, ARG1, ARG2, ...)

читает символы из стандартного ввода, интерпретирует их в

соответствии с форматом, указанном в аргументе CONTROL, и

помещает результаты в остальные аргументы. Управляющий аргу-

мент описывается ниже; другие аргументы, каждый из которых

должен быть указателем, определяют, куда следует поместить

соответствующим образом преобразованный ввод.

Управляющая строка обычно содержит спецификации преобра-

зования, которые используются для непосредственной интерпре-

тации входных последовательностей. Управляющая строка может

содержать:

·     пробелы, табуляции или символы новой строки (“символы пус-

тых промежутков”), которые игнорируются.

·      
157 -

·     Обычные символы (не %), которые предполагаются совпадающи-

ми со следующими отличными от символов пустых промежутков

символами входного потока.

·     Спецификации преобразования, состоящие из символа %, нео-

бязательного символа подавления присваивания *, необяза-

тельного числа, задающего максимальную ширину поля и сим-

вола преобразования.

Спецификация преобразования управляет преобразованием

следующего поля ввода. нормально результат помещается в пе-

ременную, которая указывается соответствующим аргументом.

Если, однако , с помощью символа * указано подавление прис-

ваивания, то это поле ввода просто пропускается и никакого

присваивания не производится. Поле ввода определяется как

строка символов, которые отличны от символов простых проме-

жутков; оно продолжается либо до следующего символа пустого

промежутка, либо пока не будет исчерпана ширина поля, если

она указана. Отсюда следует, что при поиске нужного ей вво-

да, функция SCANF будет пересекать границы строк, поскольку

символ новой строки входит в число пустых промежутков.

Символ преобразования определяет интерпретацию поля вво-

да; согласно требованиям основанной на вызове по значению

семантики языка “с” соответствующий аргумент должен быть

указателем. Допускаются следующие символы преобразования:

D - на вводе ожидается десятичное целое; соответствующий ар-

гумент должен быть указателем на целое.

O - На вводе ожидается восьмеричное целое (с лидирующим ну-

лем или без него); соответствующий аргумент должен быть

указателем на целое.

X - На вводе ожидается шестнадцатеричное целое (с лидирующи-

ми 0X или без них); соответствующий аргумент должен быть

указателем на целое.

H - На вводе ожидается целое типа SHORT; соответсвующий ар-

гумент должен быть указателем на целое типа SHORT.

C - Ожидается отдельный символ; соответствующий аргумент

должен быть указателем на символы; следующий вводимый

символ помещается в указанное место. Обычный пропуск сим-

волов пустых промежутков в этом случае подавляется; для

чтения следующего символа, который не является символом

пустого промежутка, пользуйтесь спецификацией преобразо-

вания %1S.

S - Ожидается символьная строка; соответствующий аргумент

должен быть указателем символов, который указывает на

массив символов, который достаточно велик для принятия

строки и добавляемого в конце символа \0.

F - Ожидается число с плавающей точкой; соответствующий ар-

гумент должен быть указателем на переменную типа FLOAT.

Е - символ преобразования E является синонимом для F. Формат

ввода переменной типа FLOAT включает необязательный знак,

строку цифр, возможно содержащую десятичную точку и нео-

бязательное поле экспоненты, состоящее из буквы E, за ко-

торой следует целое, возможно имеющее знак.


·     158 -

Перед символами преобразования D, O и X может стоять L,

которая означает , что в списке аргументов должен находиться

указатель на переменную типа LONG, а не типа INT. Аналогич-

но, буква L может стоять перед символами преобразования E

или F, говоря о том, что в списке аргументов должен нахо-

диться указатель на переменную типа DOUBLE, а не типа FLOAT.

Например, обращение

INT I;

FLOAT X;

CHAR NAME[50];

SCANF(“&D %F %S”, &I, &X, NAME);

со строкой на вводе

25 54.32E-1 THOMPSON

приводит к присваиванию I значения 25,X - значения 5.432 и

NAME - строки “THOMPSON”, надлежащим образом законченной

символом \ 0. эти три поля ввода можно разделить столькими

пробелами, табуляциями и символами новых строк, сколько вы

пожелаете. Обращение

 

INT I;

FLOAT X;

CHAR NAME[50];

SCANF(“%2D %F %*D %2S”, &I, &X, NAME);

с вводом

56789 0123 45A72

присвоит I значение 56, X - 789.0, пропустит 0123 и поместит

в NAME строку “45”. при следующем обращении к любой процеду-

ре ввода рассмотрение начнется с буквы A. В этих двух приме-

рах NAME является указателем и, следовательно, перед ним не

нужно помещать знак &.

В качестве другого примера перепишем теперь элементарный

калькулятор из главы 4, используя для преобразования ввода

функцию SCANF:

#INCLUDE <STDIO.H>

MAIN() /* RUDIMENTARY DESK CALCULATOR */

\(

DOUBLE SUM, V;

SUM =0;

WHILE (SCANF(“%LF”, &V) !=EOF)

PRINTF(“\T%.2F\N”, SUM += V);

\)

 

выполнение функции SCANF заканчивается либо тогда, когда она

исчерпывает свою управляющую строку, либо когда некоторый

элемент ввода не совпадает с управляющей спецификацией. В

качестве своего значения она возвращает число правильно сов-

падающих и присвоенных элементов ввода. Это число может быть


·     159 -

использовано для определения количества найденных элементов

ввода. при выходе на конец файла возвращается EOF; подчерк-

нем, что это значение отлично от 0, что следующий вводимый

символ не удовлетворяет первой спецификации в управляющей

строке. При следующем обращении к SCANF поиск возобновляется

непосредственно за последним введенным символом.

Заключительное предостережение: аргументы функции SCANF

должны быть указателями. Несомненно наиболее распространен-

ная ошибка состоит в написании

 

SCANF(“%D”, N);

вместо

SCANF(“%D”, &N);


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх