Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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, 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; Нарушение авторских прав |