Язык с функция scanf + видео обзор

Содержание
  1. Функция scanf
  2. Модификаторы формата, добавленные к функции scanf() Стандартом C99
  3. Пример
  4. scanf()
  5. Спецификаторы преобразования
  6. Ввод чисел
  7. Ввод целых значений без знака
  8. Чтение одиночных символов с помощью scanf()
  9. Чтение строк
  10. Ввод адреса
  11. Спецификатор %n
  12. Использование набора сканируемых символов
  13. Пропуск лишних разделителей
  14. Символы в управляющей строке, не являющиеся разделителями
  15. Функции scanf() необходимо передавать адреса
  16. Модификаторы форматат
  17. Подавление ввода
  18. scanf, _scanf_l, wscanf, _wscanf_l scanf, _scanf_l, wscanf, _wscanf_l
  19. Синтаксис Syntax
  20. Параметры Parameters
  21. Возвращаемое значение Return Value
  22. Комментарии Remarks
  23. Универсальное текстовое сопоставление функций Generic-Text Routine Mappings
  24. Требования Requirements
  25. scanf
  26. scanf()
  27. Спецификаторы преобразования
  28. Ввод чисел
  29. Ввод целых значений без знака
  30. Чтение одиночных символов с помощью scanf()
  31. Чтение строк
  32. Ввод адреса
  33. Спецификатор %n
  34. Использование набора сканируемых символов
  35. Пропуск лишних разделителей
  36. Символы в управляющей строке, не являющиеся разделителями
  37. Функции scanf() необходимо передавать адреса
  38. Модификаторы форматат
  39. Подавление ввода
  40. Видео

Функция 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()

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

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

Таблица 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.

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

Источник

scanf, _scanf_l, wscanf, _wscanf_l scanf, _scanf_l, wscanf, _wscanf_l

Считывает отформатированные данные из стандартного входного потока. Reads formatted data from the standard input stream. Существуют более безопасные версии этих функций; см. раздел scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l. More secure versions of these function are available; see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l.

Синтаксис Syntax

Параметры Parameters

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

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

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

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

Возвращает количество успешно преобразованных и назначенных полей. Возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. Возвращаемое значение 0 указывает, что поля не были назначены. A return value of 0 indicates that no fields were assigned.

Если параметр Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают EOF и применяют значение еинвал. If execution is allowed to continue, these functions return EOF and set errno to EINVAL.

Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr. For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

Комментарии Remarks

Функция scanf считывает данные из стандартного входного потока stdin и записывает данные в расположение, заданное аргументом. The scanf function reads data from the standard input stream stdin and writes the data into the location given by argument. Каждый аргумент должен быть указателем на переменную типа, которая соответствует спецификатору типа в формате. Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. Если копирование производится между перекрывающимися строками, поведение не определено. If copying takes place between strings that overlap, the behavior is undefined.

При чтении строки с помощью scanf всегда указывайте ширину для формата % s (например, «%32» вместо «% s»); в противном случае входные данные неправильного формата могут легко вызвать переполнение буфера. When reading a string with scanf, always specify a width for the %s format (for example, «%32s» instead of «%s»); otherwise, improperly formatted input can easily cause a buffer overrun. Кроме того, рекомендуется использовать scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l или fgets. Alternately, consider using scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l or fgets.

wscanf — это версия scanf для расширенных символов; Аргумент формата для wscanf является строкой расширенных символов. wscanf is a wide-character version of scanf; the format argument to wscanf is a wide-character string. поведение wscanf и scanf идентично, если поток открыт в режиме ANSI. wscanf and scanf behave identically if the stream is opened in ANSI mode. scanf в настоящее время не поддерживает входные данные из потока Юникода. scanf doesn’t currently support input from a UNICODE stream.

Версии этих функций с суффиксом _l идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо локали текущего потока. The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current thread locale.

Универсальное текстовое сопоставление функций Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine_UNICODE и _MBCS не определены _UNICODE & _MBCS not defined_MBCS определено _MBCS defined_UNICODE определено _UNICODE defined
_tscanf _tscanfscanf scanfscanf scanfwscanf wscanf
_tscanf_l _tscanf_l_scanf_l _scanf_l_scanf_l _scanf_l_wscanf_l _wscanf_l

Требования Requirements

Подпрограмма RoutineОбязательный заголовок Required header
scanf, _scanf_l scanf, _scanf_l
wscanf, _wscanf_l wscanf, _wscanf_lили or

Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). The console is not supported in Universal Windows Platform (UWP) apps. Стандартные дескрипторы потока, связанные с консолью, stdin, stdout и stderr, должны быть перенаправляться до того, как функции времени выполнения C смогут использовать их в приложениях UWP. The standard stream handles that are associated with the console, stdin, stdout, and stderr, must be redirected before C run-time functions can use them in UWP apps. Дополнительные сведения о совместимости см. в статье Compatibility. For additional compatibility information, see Compatibility.

Источник

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.)

Источник

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.

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

Источник

Видео

Язык си с нуля | #7 Строки в си(scanf).

Язык си с нуля | #7 Строки в си(scanf).

C. Урок 7. Команды ввода и вывода

C. Урок 7. Команды ввода и вывода

Программирование на Си урок 30: Функции ввода и вывода строк в языке Си

Программирование на Си урок 30: Функции ввода и вывода строк в языке Си

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

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

Фишки языка C++ #4. Форматированный ввод scanf

Фишки языка C++ #4.  Форматированный ввод scanf

57075 Ввод-вывод в языках C и C++. Секреты функций printf и scanf.

57075 Ввод-вывод в языках C и C++. Секреты функций printf и scanf.

Язык Си для начинающих / #6 - Функции в Си

Язык Си для начинающих / #6 - Функции в Си

Как заставить работать функцию scanf в visual studio

Как заставить работать функцию scanf в visual studio

Программирование на Си - Урок 5 - ввод с клавиатуры scanf, пишем калькулятор

Программирование на Си - Урок 5 - ввод с клавиатуры scanf, пишем калькулятор

C (Си): язык программирования Си, ввод данных (scanf, scanf_s) урок 5!

C (Си): язык программирования Си, ввод данных (scanf, scanf_s) урок 5!
Поделиться или сохранить к себе:
Добавить комментарий

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