Что содержит форматная строка функции scanf

Функция scanf

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

Спецификации формата начинаются знаком % и сообщают функции scanf() тип данного, которое будет прочитано. Спецификации формата приведены в таблице 13.3. Например, по спецификации %s будет прочитана строка, а по спецификации %d — целое значение. Строка форматирования читается слева направо, и спецификации формата сопоставляются аргументам в порядке их перечисления в списке аргументов.

Таблица 13.3. Спецификации формата функции scanf()
КодНазначение
%aЧитает значение с плавающей точкой (только C99)
%AАналогично коду %a (только C99)
%cЧитает один символ
%dЧитает десятичное целое
%iЧитает целое в любом формате (десятичное, восьмеричное или шестнадцатеричное)
%eЧитает число с плавающей точкой
%EАналогично коду %e
%fЧитает число с плавающей точкой
%FАналогично коду %f (только С99)
%gЧитает число с плавающей точкой
%GАналогично коду %g
%oЧитает восьмеричное число
%sЧитает строку
%xЧитает шестнадцатеричное число
%XАналогично коду %x
%pЧитает указатель
%nПринимает целое значение, равное количеству прочитанных до сих пор символов
%uЧитает десятичное целое без знака
%[]Просматривает набор символов
%%Читает знак процента

Современные компиляторы, поддерживающие добавленные в 1995 году средства работы с двухбайтовыми символами, позволяют к спецификации c применить модификатор l ; тогда будет считаться, что соответствующий указатель указывает на двухбайтовый символ (т.е. на данное типа whcar_t ). Модификатор l также можно использовать с кодом формата s ; тогда будет считаться, что соответствующий указатель указывает на строку двухбайтовых символов. Кроме того, модификатор l можно использовать для того, чтобы указать, что набор сканируемых символов состоит из двухбайтовых символов.

Если в строке форматирования встретится разделитель, то функция scanf() пропустит один или несколько разделителей во входном потоке. Под разделителем, или пробельным символом, подразумевается пробел, символ табуляции или разделитель строк (символ новой строки). По сути, наличие одного разделителя в управляющей строке приведет к тому, что функция scanf() будет читать, не сохраняя, любое количество (возможно, даже нулевое) разделителей до первого символа, отличного от разделителя.

Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком % и кодом формата, которое ограничивает количество читаемых для всех полей символов. Например, если в переменную address нужно прочитать не более 20 символов, используется следующий оператор.

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

Важно помнить, что в наборе сканируемых символов различаются прописные и строчные буквы. Следовательно, чтобы сканировать как прописные, так и строчные буквы, в наборе сканируемых символов придется задать их отдельно.

Модификаторы формата, добавленные к функции scanf() Стандартом C99


Пример

Действие данных операторов scanf() объясняется в комментариях.

Источник

Функция scanf

Основное отличие функции scanf в том, что при считывании чисел (или значений типа char) ей необходимо передавать адреса переменных (в языке C все параметры передаются по значению, поэтому чтобы функция scanf могла модифицировать переменную, необходимо передать в функцию адрес этой переменной). Поэтому перед названиями переменных мы пишем знак амперсанда («&»).

В функции scanf могут быть явно записаны какие-то символы, кроме форматных строк. Например, вызов

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

Особенности считывания чисел

Функция scanf корректно считывает целые числа, если они начинаются с символа 0, или со знака «+». То есть числа «+123» или «0123» будут корректно считаны по форматной строке «%d», никаких дополнительных параметров задавать не нужно.

Также при считывании чисел игнорируются пробелы перед числом. Это означает, что вызов

Чтобы считать записать вида «01␣:␣23» можно использовать форматную строку «%d :%d», причем пробел в форматной строке может означать и отсутствие пробелов.

Возможные форматные символы

Форматная
строка
Соответствующий ей тип
%hhdСчитать число (десятичное) и записать его в переменную типа char (для unsigned char нужно использовать %hhu)
%hdshort int (для unsigned short int нужно использовать %hu)
%dint (для unsigned int нужно использовать %u)
%ldlong int (для unsigned long int нужно использовать %lu)
%lldlong long int (для unsigned long long int нужно использовать %llu)
%ffloat
%lfdouble
%Lflong double
char. Считывается один символ, он может быть пробелом или символом конца строки.
%sСчитывается последовательность непробельных символов (строка), записывается в C-строку (типа char * или char[])

Особенность считывание символов

Считывание одного символа «%c» считывает из потока ввода следующий символ, он может быть в том числе и пробельным символом, а также символом конца строки. Но если в форматной строке перед «%c» поставить пробел, то поскольку пробел в форматной строке обозначает последовательность пробельных символов любой длины, то в этом случае будет считан следующий непробельный символ.

Особенность считывания строк

При считывании строки результат записывается в С-строку, которая представляет собой массив символов (или указатель типа char * с выделенной памятью). Поскольку строка в языке C является адресом (указателем) в памяти, где хранится начало строки символов, то передавать в функцию scanf нужно имя переменной без указания амперсанда.

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

Функция gets считается опасной и не рекомендуется для использования, так как она не контролирует количество считанных символов и не учитывает длину передаваемой строки, что может привести к записи данных за пределами строки.

В данном случае мы использовали stdin для чтения со стандартного ввода.

Возвращаемое значение

Функция scanf возвращает значение, равное числу успешно считанных и записанных в переданные параметры значений, что можно использовать для анализа входных данных.

Тогда при вводе строки «12:34» функция scanf считает два числа, запишет их в переменные a и b и вернет значение 2. А при вводе «12 34» будет считано только одно число, поскольку после него должно идти двоеточие, то второе число считано не будет и функция scanf вернет значение 1.

Источник

Форматированный ввод данных

В то время как функция printf() осуществляет форматированный вывод данных, функция scanf() осуществляет их форматированный ввод. Это значит, что поступающие на ввод данные преобразуются соответственно указанному формату(ам) и записываются по адресу(ам) указанной(ых) переменной(ых):

Причина, по которой в scanf() передаются адреса, а не значения переменных, очевидна. Функция scanf() должна изменять значения переменных тех функций, из которых вызывается. Единственный способ — это получить адреса областей памяти.

Ввод чисел, символов и строк

Пример ввода-вывода целого и вещественного чисел, символа и строки:

Здесь при выполнении программы все данные были введены в одну строку. Разделителем между числами и строками является пробел, а также любой другой символ пустого пространства (например, ‘\n’). Однако при считывании символа, пробел учитывается как символ; чтобы этого не произошло, в примере букву записали сразу после числа. Данные можно было бы ввести, разделяя их переходом на новую строку (опять же при этом надо иметь ввиду, как считывается символ).

Обратите внимание, перед переменной str отсутствует знак амперсанда. Это не опечатка. В последующих уроках вы узнаете, что имя массива уже само по себе является ссылкой на массив (другими словами, str содержит адрес начала массива).

Функция scanf() возвращает количество удачно считанных данных; т.е. значение, возвращаемое функцией, можно проанализировать и таким образом узнать, корректно ли были введены данные. Например:

Обычные символы в строке формата

В строке формата scanf() допустимо использование обычных символов. В этом случае при вводе данных также должны вводится и эти символы:

В данном случае, когда программа выполняется, ввод должен выглядеть примерно так: 342+1024 = 1366. Знаки «+» и «=» обязательно должны присутствовать между числами, наличие пробелов или их отсутствие абсолютно никакой роли не играет:

Запрет присваивания

Если какие-либо данные, вводимые пользователем, следует проигнорировать, то используют запрет присваивания, ставя после знака %, но перед буквой формата звездочку *. В таком случае данные считываются, но никакой переменной не присваиваются. Это можно использовать, например, когда нет определенной уверенности в том, что поступит на ввод, с одной стороны, и нужды сохранять эти данные, с другой:

Здесь предполагается, что перед каждым числом будет вводится строка, которую следует проигнорировать, например:

Использование «шаблонов»

Для функции scanf() есть пара спецификаций формата, отдаленно напоминающих шаблоны командной оболочки и др. Формат […] позволяет получить строку, содержащую любые символы, указанные в квадратных скобках. Как только на ввод поступает символ, не входящий в указанный набор, считывание данных прекращается. Формат [^…], наоборот, помещает в строку символы, не входящие в указанный набор, до тех пор пока не встретит любой из указанных.

В примере ниже как только поступает не цифра, считывание ввода завершается. При этом если первый символ — не цифра, то в str вообще ничего не записывается:

А в этом случае строке будет присвоена последовательность символов до любого из указанных знаков препинания:

Некоторые особенности и ограничения функции scanf()

Как только поступают некорректные данные, функция scanf() завершает свою работу. В примере:

если переменной a попытаться присвоить символ или строку, что невозможно, то переменная bуже обрабатываться не будет. Можно предположить, что так будет надежнее:

Источник

scanf()

Теперь поговорим о каждом из этих видов.

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

Таблица 8.3. Спецификаторы преобразования для функции scanf()
КодЗначение
%aЧитает значение с плавающей точкой (только С99)
%cЧитает одиночный символ
%dЧитает десятичное целое число
%iЧитает целое число как в десятичном, так и восьмеричном или шестнадцатеричном формате
%eЧитает число с плавающей точкой
%fЧитает число с плавающей точкой
%gЧитает число с плавающей точкой
Читает восьмеричное число
%sЧитает строку
%xЧитает шестнадцатеричное число
%pЧитает указатель
%nПринимает целое значение, равное количеству уже считанных символов
%uЧитает десятичное целое число без знака
%[]Читает набор сканируемых символов
%%Читает знак процента

Ввод чисел

Функция scanf() прекращает чтение числа тогда, когда встречается первый нечисловой символ.

Ввод целых значений без знака


Чтение одиночных символов с помощью scanf()

При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей. Например, при вводе с входного потока «x y» фрагмент кода

Чтение строк


Ввод адреса


Спецификатор %n

Спецификатор %n указывает, что scanf() должна поместить количество символов, считанных (до того момента, когда встретился %n ) из входного потока в целую переменную, указанную соответствующим аргументом.

Использование набора сканируемых символов

При использовании набора сканируемых символов функция scanf() продолжает читать символы, помещая их в соответствующий массив символов, пока не встретится символ, не входящий в этот набор. При возвращении из scanf() в массиве символов будет находиться строка, состоящая из считанных символов, причем эта строка будет заканчиваться символом конца строки. Чтобы увидеть, как это все работает, запустите следующую программу:

В большинстве реализаций для указания диапазона можно использовать дефис. Например, указанный ниже набор сканируемых символов дает функции scanf() указание принимать символы от А до Z:

Следует обратить внимание на такой важный момент: набор сканируемых символов чувствителен к регистру букв. Если нужно сканировать буквы и на верхнем, и на нижнем регистре, то их надо указывать отдельно для каждого регистра.

Пропуск лишних разделителей

Разделитель в управляющей строке дает scanf() указание пропустить в потоке ввода один или несколько начальных разделителей. Разделителями являются пробелы, табуляции, вертикальные табуляции, подачи страниц и разделители строк. В сущности, один разделитель в управляющей строке заставляет scanf() читать, но не сохранять любое количество (в том числе и нулевое) разделителей, которые находятся перед первым символом, не являющимся разделителем.

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


Функции scanf() необходимо передавать адреса

Строки будут читаться в символьные массивы, а имя массива без индекса является адресом первого его элемента. Таким образом, чтобы прочитать строку в символьный массив, можно использовать оператор

Модификаторы форматат

Если поток ввода содержит больше 20 символов, то при следующем вызове функций ввода считывание начнется после того места, где оно закончилось при предыдущем вызове. Например, если вы в ответ на вызов scanf() из этого примера введете

в str будут помешены буквы UVWXYZ. Ввод из поля может завершиться и до того, как будет достигнута максимальная длина поля — если встретится разделитель. В таком случае scanf() переходит к следующему полю.

На заметкуВ С99 для функции scanf() имеются еще и другие модификаторы типа; о них рассказывается в части II.

Подавление ввода

Источник

в Visual Studio 2015 printf функция и scanf семейство функций были объявлены как inline и перемещены в заголовки и. При переносе старого кода вы можете увидеть ошибку LNK2019 в подключении к этим функциям. Дополнительные сведения см. в статье Visual C++ журнал изменений 2003-2015.

Синтаксис

Параметры

format
Строка управления форматированием.

argument
Необязательные аргументы.

locale
Используемый языковой стандарт.

Возвращаемое значение

Возвращает количество успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Возвращаемое значение 0 указывает, что поля не были назначены.

Комментарии

wscanf — это версия scanf с расширенными символами; аргумент format для wscanf — строка расширенных символов. wscanf и scanf ведут себя одинаково, если поток открыт в режиме ANSI. scanf сейчас не поддерживает ввод из потока ЮНИКОДА.

Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.

Универсальное текстовое сопоставление функций

TCHAR.H ассемблер_UNICODE & _MBCS не определено_MBCS определяется_UNICODE определяется
_tscanf scanf scanf wscanf
_tscanf_l _scanf_l _scanf_l _wscanf_l

Требования

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *