Что такое scanf s

scanf

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

Управляющая строка, на которую указывает format, состоит из символов трех типов:

Спецификаторы формата следуют за символом процент и сообщают scanf(), данные какого типа будут считаны следующими. Коды спецификаторов приведены в таблице.

Табпица: Коды форматов для scanf()

КодЗначение
Считать один символ
%dСчитать десятичное число целого типа
%iСчитать десятичное число целого типа
Считать число с плавающей запятой
%fСчитать число с плавающей запятой
%gСчитать число с плавающей запятой
Считать восьмеричное число
%sСчитать строку
Считать шестнадцатиричное число
Считать указатель
%nПринимает целое значение, равное количеству считанных до текущего момента символов
%uСчитывает беззнаковое целое
%[]Просматривает набор символов
%%Считывает символ %

Например, %s считывает строку, a %d считывает переменную целого типа.

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

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

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

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

Например, чтобы считать целое число и присвоить его значение переменной count, необходи­мо воспользоваться следующим обращением к scanf():

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

В этом случае имя address уже является указателем и не нуждается в префиксе &.

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

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

Знак *, помещенный после % и перед спецификатором формата, считывает данные указанного типа, но подавляет их присваивание. Таким образом, код

при вводе последовательности 10/20 присваивает значение 10 переменной х, отбрасывает символ / и присваивает значение 20 переменной у.

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

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

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

поместит символ х в переменную а, пробел — в переменную b и y — в переменную c.

Надо быть внимательным: любые другие символы в управляющей строке — включая пробелы, символы табуляции и новых строк — используются для указания и отбрасывания символов из входного потока. Например, при входном потоке 10t20 функция

поместит 10 в х, а 20 в у. Символ t будет отброшен, поскольку в управляющей строке имеется t.

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

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

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

С помощью кавычек можно задать диапазон воспринимаемых символов. Например, следующее выражение дает указание scanf() принимать буквы от «А» до «Z»:

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

Функция scanf() возвращает число, равное количеству полей, значения которых были действи­тельно присвоены переменным. В это количество не входят поля, которые были считаны, но их значения не были ничему присвоены вследствие использования модификатора * для подавления присваивания. Если до присвоения значения первого поля произошла ошибка, возвращается EOF.

При использовании Borland С++ в 16-разрядной среде можно изменить модель памяти, ис­пользуемую по умолчанию для компилирования программы, путем явного указания размера каж­дого указателя, используемого при вызове scanf(). Ближний указатель задается модификатором N, а дальний — модификатором F. (Нельзя использовать модификатор N, если программа ском­пилирована для модели памяти huge.)

Источник

в 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

Требования

Источник

scanf Спецификация ширины

width Поле

Спецификация ширины является отдельной и не зависит от аргумента размера буфера, необходимого безопасными версиями этих функций (например,, scanf_s wscanf_s и т. д.). В следующем примере спецификация ширины равна 20; это означает, что из входного потока могут быть прочитаны до 20 символов. Длина буфера равна 21, что включает место для возможных 20 символов плюс завершающий нуль-символ:

Если width поле не используется, scanf_s пытается прочитать в строку весь токен. Если указанный размер недостаточно велик для хранения всего маркера, в целевую строку ничего не записывается. Если width поле указано, то первые width символы в маркере записываются в строку назначения вместе с нулевым символом конца строки.

Префикс размера

Префиксы размера для scanf wscanf спецификаторов формата и типа

В следующих примерах h используются l функции и с функциями scanf_s и wscanf_s функциями:

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

Чтение неразделяющих строк

Для чтения строк, не разделенных символами пробела, набор символов в квадратных скобках ( [ ] ) можно заменить на s символ типа (String). Набор символов в квадратных скобках называется строкой элемента управления. Соответствующее поле ввода считывается до первого символа, который не отображается в управляющей строке. Если первый символ в наборе — символ каретки ( ^ ), логика работы меняется на обратную: поле ввода считывается до первого символа, который есть в остальной части набора символов.

Чтение незавершенных строк

Когда scanf останавливает чтение поля

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

Достигнута указанная ширина.

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

Следующий символ конфликтует с символом в управляющей строке, которой он должен соответствовать.

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

По какой бы причине функция 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 s. Смотреть фото Что такое scanf s. Смотреть картинку Что такое scanf s. Картинка про Что такое scanf s. Фото Что такое scanf s

printf() — отвечает за вывод;

scanf() — отвечает за ввод.

О выводе информации при помощи функции printf() мы поговорим в следующих статьях, а на функции scanf() в Си остановимся по подробнее.

Функция scan() в Си

int scanf(“форматная строка“, «место для сохранения считанных значений»)

При помощи «форматной строки» разработчик задает инструкции для интерпретации вводимых данных. Форматная строка может состоять из 3-х типов символов:

преобразующий спецификатор — значение, задающее инструкции, плюс знак «%»;

специальный разделяющий символ — это «пробел» между несколькими спецификаторами;

не специальный символ.

Преобразующий спецификатор

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

Преобразующие спецификаторы имеют следующие значения:

«%а» — чтение значения с «плавающей точкой»;

«%c» — считывание одиночного символа;

«%d» — чтение целого десятичного числа;

«%i» — считывание чисел разных форматов: десятичного, восьм е ричного, шестнадцатиричного;

«%e», «%f», «%g» — чтение числа с «плавающей точкой»;

«%о» — считывание вос ь м е ричного числа;

«%х» — считывание шестнадцат е ричного числа;

«%р» — чтение указателя;

«%n» — передать значение уже считанных знаков;

«%u» — считывание целого десятичного числа, не беря во внимание знак;

«%[]» — чтение всех отсканированных символов;

«%%» — считывание знака «проценты».

Примеры использования scanf() в Си

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

Чтение целого десятичного числа без учета знака:

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

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

scanf(«%d», &x); // считать первое целое значение и адресовать его в переменную «x»

scanf(«%d», &y); // считать второе целое значение и адресовать его в переменную «y»

printf(«%d + %d = %d\n», x, y, result);

Разница между scanf() и scanf_s() в Си

В функциональности этих функций нет никакой разницы, просто scanf() появилась в первых версиях языка С, поэтому считается менее защищенной. Обычно при работе с о scanf() в современных компиляторах требуется наличие строки «#define _CRT_SECURE_NO_WARNINGS» в кодовом документе.

Либо можно применять усовершенствованную функцию scanf_s(), которая считается уже защищенной и не требует наличия вышеописанной строки.

Заключение

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

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

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