Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





Осуществляющая ввод функция scanf является аналогом printf и позволяет проводить в обратном направлении многие из тех же самых преобразований. Функция

scanf(control, arg1, arg2,...)

читает символы из стандартного ввода, интерпретирует их в соответствии с форматом, указанном в аргументе control, и помещает результаты в остальные аргументы. Управляющий аргу­мент описывается ниже; другие аргументы, каждый из которых должен быть указателем, определяют, куда следует поместить соответствующим образом преобразованный ввод.

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

· Пробелы, табуляции или символы новой строки ("символы пус­тых промежутков"), которые игнорируются.

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

· Спецификаторы формата имеют следующую форму: % [*] [width] [F/N] [h/l/L] type_character состоящие из

o символа %

o нео­бязательного символа подавления присваивания [*] - Подавляет запись в память следующего входного поля.

o необяза­тельного числа, задающего максимальную ширину поля [width] - Максимальное количество читаемых символов; меньшее количество может быть прочитано, если...scanf встречает символ-разделитель или непреобразуемый символ.

o необязательный модификатор размера указателя, [F/N] – Изменяет принимаемое по умолчанию значение длины адреса:

§ N = near pointer

§ F = far pointer

o необязательный модификатор типа аргумента, [h/l/L] – Изменяет принимаемое по умолчанию значение типа аргумента

§ h = short int

§ l = long int (если символ типа определяет преобразование в целый тип)

§ l = double (если символ типа определяет преобразование в тип с плавающей точкой)

§ L = long double (допустимо только для преобразования в тип с плавающей точкой)

o - type_character - символ типа

Спецификация преобразования управляет преобразованием следующего поля ввода. нормально результат помещается в пе­ременную, которая указывается соответствующим аргументом. Если, однако, с помощью символа * указано подавление прис­ваивания, то это поле ввода просто пропускается и никакого присваивания не производится. Поле ввода определяется как строка символов, которые отличны от символов простых проме­жутков; оно продолжается либо до следующего символа пустого промежутка, либо пока не будет исчерпана ширина поля, если она указана. Отсюда следует, что при поиске нужного ей вво­да, функция scanf будет пересекать границы строк, поскольку символ новой строки входит в число пустых промежутков.

Символ преобразования определяет интерпретацию поля вво­да; согласно требованиям основанной на вызове по значению семантики языка "с" соответствующий аргумент должен быть указателем. Допускаются следующие символы преобразования:

  • d - на вводе ожидается десятичное целое; соответствующий аргумент должен быть указателем на целое.
  • - На вводе ожидается восьмеричное целое (с лидирующим ну­лем или без него); соответствующий аргумент должен быть указателем на целое.
  • x - На вводе ожидается шестнадцатеричное целое (с лидирующи­ми 0X или без них); соответствующий аргумент должен быть указателем на целое.
  • h - На вводе ожидается целое типа short; соответсвующий ар­гумент должен быть указателем на целое типа short.
  • c - Ожидается отдельный символ; соответствующий аргумент должен быть указателем на символы; следующий вводимый символ помещается в указанное место. Обычный пропуск сим­волов пустых промежутков в этом случае подавляется; для чтения следующего символа, который не является символом пустого промежутка, пользуйтесь спецификацией преобразо­вания %1s.
  • s - Ожидается символьная строка; соответствующий аргумент должен быть указателем символов, который указывает на массив символов, который достаточно велик для принятия строки и добавляемого в конце символа \0.
  • f - Ожидается число с плавающей точкой; соответствующий ар­гумент должен быть указателем на переменную типа float.
  • е - символ преобразования E является синонимом для f. Формат ввода переменной типа float включает необязательный знак, строку цифр, возможно содержащую десятичную точку и нео­бязательное поле экспоненты, состоящее из буквы e, за ко­торой следует целое, возможно имеющее знак.

Перед символами преобразования 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 заканчивается либо тогда, когда она исчерпывает свою управляющую строку, либо когда некоторый элемент ввода не совпадает с управляющей спецификацией. В качестве своего значения она возвращает число правильно сов­падающих и присвоенных элементов ввода. Это число может быть использовано для определения количества найденных элементов ввода. При выходе на конец файла возвращается EOF; подчерк­нем, что это значение отлично от 0, что следующий вводимый символ не удовлетворяет первой спецификации в управляющей строке. При следующем обращении к scanf поиск возобновляется непосредственно за последним введенным символом.

Заключительное предостережение: аргументы функции scanf должны быть указателями. Несомненно наиболее распространен­ная ошибка состоит в написании

scanf("%d", n);

вместо

scanf("%d", &n);

Здесь указаны не все тонкости работы функции scanf. За более подробными сведениями обращайтесь в соответствующие справочники и учебники.

Функция возвращает количество прочитанных символов или EOF в случае ошибки.







Date: 2015-12-12; view: 448; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию