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

Осуществляющая ввод функция scanf является аналогом printf и позволяет проводить в обратном направлении многиеиз тех же самых преобразований. Функция scanf (control, arg1, arg2,...) читает символы из стандартного ввода, интерпретирует их всоответствии с форматом, указанном в аргументе control, ипомещает результаты в остальные аргументы. Управляющаястрока описывается ниже; другие аргументы, каждый из которыхдолжен быть указателем, определяют, куда следует поместитьсоответствующим образом преобразованный ввод. Управляющая строка обычно содержит спецификации преоб-разования, которые используются для непосредственной интерп-ретации входных последовательностей. Управляющая строка -55- может содержать: - пробелы, табуляции или символы новой строки ("символы пустых промежутков"), которые игнорируются; - обычные символы (не %), которые предполагаются совпа- дающими со следующими отличными от "символов пустых промежутков" символами входного потока; - спецификации преобразования, состоящие из символа %, необязательного символа подавления присваивания *, необязательного числа, задающего максимальную ширину поля и символа преобразования. Спецификация преобразования управляет преобразованиемследующего поля ввода. Обычно результат помещается в пере-менную, которая указывается соответствующим аргументом.Если, однако, с помощью символа * указано подавление прис-ваивания, то это поле ввода просто пропускается и никакогоприсваивания не производится. Поле ввода определяется какстрока символов, которые отличны от "символов простых проме-жутков"; оно продолжается либо до следующего символа пустогопромежутка, либо пока не будет исчерпана ширина поля, еслиона указана. Отсюда следует, что при поиске нужного ейввода, функция scanf будет пересекать границы строк, пос-кольку символ новой строки является одним из символов пустыхпромежутков. Имеется возможность задания более сложного алгоритмавыделения полей ввода, которая описана в руководстве прог-раммиста (" scanf (3)"). Символ преобразования определяет интерпретацию поляввода; поскольку в Си аргументы передаются по значению,аргументы scanf должны быть указателями. Допускаются следую-щие символы преобразования: d - На вводе ожидается десятичное целое; соответствующий аргумент должен быть указателем на целое. o - На вводе ожидается восьмеричное целое (с лидирующим нулем или без него); соответствующий аргумент должен быть указателем на целое. x - На вводе ожидается шестнадцатиричное целое (с лидиру- ющими 0 х или без них); соответствующий аргумент дол- жен быть указателем на целое. h - На вводе ожидается целое типа short; соответствующий аргумент должен быть указателем на целое типа short. c - Ожидается отдельный символ; соответствующий аргумент должен быть указателем на символы; следующий вводимый -56- символ помещается в указанное место. Обычный пропуск символов пустых промежутков в этом случае подавля- ется; для чтения следующего символа, который не явля- ется символом пустого промежутка, пользуйтесь специ- фикацией преобразования % 1 s. s - Ожидается символьная строка; соответствующий аргумент должен быть указателем символов, который указывает на массив символов, достаточно большой для принятия строки и добавляемого в конце символа \0. f - Ожидается число с вещественной точкой; соответствую- щий аргумент должен быть указателем на переменную типа float. e - Символ преобразования e является синонимом для f. Формат ввода переменной типа float включает необяза- тельный знак, строку цифр, возможно содержащую деся- тичную точку и необязательное поле экспоненты, состо- ящее из буквы e, за которой следует целое, возможно имеющее знак. Перед символами преобразования d, o и x может стоятьбуква l, которая означает, что в списке аргументов долженнаходиться указатель на переменную типа long, а не типа int. Аналогично, буква l может стоять перед символами преобразо-вания e или f, говоря о том, что в списке аргументов долженнаходиться указатель на переменную типа double, а не типа float. Например, обращение int 1; float х; char name [50]; scanf ("% d % f % s ", & i, & х, name); со строкой на вводе 25 54.32 e -1 thompson приводит к присваиванию i значения 25, х - значения 5.432 и name - строки " thompson ", надлежащим образом законченнойсимволом \ 0. Эти три поля ввода можно разделить произволь-ным числом пробелов, табуляций и символов новой строки,сколько вы пожелаете. Обращение int i; float х; char name [50]; scanf ("% 2d % f %* d % 2s ", & i, & х, name); с вводом -57- 56789 0123 45а72 присвоит i значение 56, х - 789. 0, пропустит 0123 и поместитв name строку " 45 ". При следующем обращении к любой проце-дуре ввода рассмотрение начнется с буквы a. В этих двух при-мерах name является указателем и, следовательно, перед нимне нужно помещать знак &. В качестве другого примера приведем программу для сум-мирования чисел, вводимых с терминала: #include < stdio.h > main () /* Примитивный калькулятор */ { double sum, v; sum =0; while (scanf (" %lf ", &v)!= EOF) printf (" \t%. 2 fFI\n ", sum += v); } Выполнение функции scanf заканчивается либо тогда, когда онаисчерпывает свою управляющую строку, либо когда некоторыйэлемент ввода не соответствует очередной спецификации преоб-разования. В качестве своего значения она возвращает числоправильно распознанных элементов ввода. Это число может бытьиспользовано для определения количества найденных элементовввода. При выходе на конец файла возвращается EOF; подчерк-нем, что это значение отлично от 0, означающего, что следую-щий вводимый символ не удовлетворяет первой спецификации вуправляющей строке. При следующем обращении к scanf поисквозобновляется непосредственно за последним введенным симво-лом. ПРЕДОСТЕРЕЖЕНИЕ: аргументы функции scanf должны бытьуказателями. Несомненно, наиболее распространенная ошибкасостоит в написании scanf (" %d ", n); вместо scanf (" %d ", &n);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: