sscanf — Разбирает строку в соответствии с заданным форматом


Содержание

scanf()

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

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

Управляющая строка состоит из символов трех видов:

  • спецификаторов преобразования,
  • разделителей,
  • символов, не являющихся разделителями.

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

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

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

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

Ввод чисел

Для чтения целого числа используйте спецификатор преобразования %d или %i . A для чтения числа с плавающей точкой, представленного в стандартном или экспоненциальном виде, используйте спецификатор преобразования %e , %f или %g . (Кроме того, для чтения числа с плавающей точкой стандарт С99 разрешает использовать также спецификатор преобразования %a .)

Функцию scanf() можно использовать для чтения целых значений в восьмеричной или шестнадцатеричной форме, применяя для этого соответственно команды форматирования %o и %x , последняя из которых может быть как на верхнем, так и на нижнем регистре. Когда вводятся шестнадцатеричные числа, то буквы от А до F, представляющие шестнадцатеричные цифры, должны быть на том же самом регистре, что и литера-спецификатор. Следующая программа читает восьмеричное и шестнадцатеричное число:

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

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

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

выполняют считывание целого числа без знака и присваивают его переменной num .

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

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

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

помещает символ x в a , пробел — в b , а символ y — в c .

Чтение строк

Для чтения из входного потока строки можно использовать функцию scanf() со спецификатором преобразования %s . Использование спецификатора преобразования %s заставляет scanf() читать символы до тех пор, пока не встретится какой-либо разделитель. Читаемые символы помещаются в символьный массив, на который указывает соответствующий аргумент, а после введенных символов еще добавляется символ конца строки (‘0’). Что касается scanf() , то таким разделителем может быть пробел, разделитель строк, табуляция, вертикальная табуляция или подача страницы. В отличие от gets() , которая читает строку, пока не будет нажата клавиша , scanf() читает строку до тех пор, пока не встретится первый разделитель. Это означает, что scanf() нельзя использовать для чтения строки «это испытание», потому что после пробела процесс чтения прекратится. Чтобы увидеть, как действует спецификатор %s , попробуйте при выполнении этой программы ввести строку «привет всем»:

Программа выведет только часть строки, то есть слово привет .

Ввод адреса

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

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

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

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

Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов (scanset). Набор сканируемых символов представляет собой множество символов. Когда scanf() обрабатывает такое множество, то вводит только те символы, которые входят в набор сканируемых символов. Читаемые символы будут помещаться в массив символов, который указан аргументом, соответствующим набору сканируемых символов. Этот набор определяется следующим образом: все те символы, которые предстоит сканировать, помещают в квадратные скобки. Непосредственно перед открывающей квадратной скобкой должен находиться знак % . Например, следующий набор сканируемых символов дает указание scanf() сканировать только символы X, Y и Z:

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

Введите 123abcdtye , а затем нажмите клавишу . После этого программа выведет 123 abed tye . Так как в данном случае ‘t’ не входит в набор сканируемых символов, то scanf() прекратила чтение символов в переменную str сразу после того, как встретился символ ‘t’. Оставшиеся символы были помещены в переменную str2 .

Кроме того, можно указать набор сканируемых символов, работающий с точностью до наоборот; тогда первым символом в таком наборе должен быть ^ . Этот символ дает указание scanf() принимать любой символ, который не входит в набор сканируемых символов.

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

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

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

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

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

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

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

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

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

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

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

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

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

то в str из-за спецификатора максимальной ширины поля будет помещено только 20 символов, то есть символы вплоть до Т. Это значит, что оставшиеся символы UVWXYZ пока еще не прочитаны. При следующем вызове scanf() , например при выполнении оператора

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

Чтобы прочитать длинное целое, перед спецификатором формата поместите l (эль). А для чтения короткого целого значения перед спецификатором формата следует поместить n . Эти модификаторы можно использовать со следующими кодами форматов: d , i , o , u , x и n .

По умолчанию спецификаторы f , e и g дают scanf() указание присваивать данные переменной типа float . Если перед одним из этих спецификаторов будет помещен l (эль), то scanf() будет присваивать данные переменной типа double . Использование L дает scanf() указание, чтобы переменная, принимающая данные, имела тип long double .

Если в компиляторе предусмотрена обработка двухбайтовых символов [1] , добавленных в язык С Поправкой 1 от 1995 года, то модификатор l можно также использовать с такими кодами формата, как c и s . l непосредственно перед c является признаком указателя на объект типа wchar_t . А l непосредственно перед s — признак указателя на массив элементов типа wchar_t . Кроме того, l также применяется для модификации набора сканируемых символов, чтобы этот набор можно было использовать для двухбайтовых символов.

В Стандарте С99, кроме перечисленных, предусмотрены также модификаторы ll и hh , последний из которых можно применять к спецификаторам d , i , o , u , x или n . Он является признаком того, что соответствующий аргумент является указателем на значение, типа signed или unsigned char . Кроме того, к спецификаторам d , i , o , u , x и n можно применять и ll , этот спецификатор является признаком того, что соответствующий аргумент является указателем на значение типа signed (или unsigned ) long long int .

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

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

scanf() может прочитать поле, но не присваивать прочитанное значение никакой переменной; для этого надо перед литерой-спецификатором формата поля поставить звездочку, * . Например, когда выполняется оператор

можно ввести пару координат 10,10 . Запятая будет прочитана правильно, но ничему не будет присвоена. Подавление присвоения особенно полезно тогда, когда нужно обработать только часть того, что вводится.

[1] Называются также символами в расширенном 16-битном алфавите или символами уникода . (Unicode (уникод) — 16-битовый стандарт кодирования символов, позволяюший представлять алфавиты всех существующих в мире языков.)


sscanf

(PHP 4 >= 4.0.1, PHP 5)

sscanf — Разбирает строку в соответствии с заданным форматом

Описание

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

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

Example#1 sscanf() Example

Example#2 sscanf() — использование необязательных аргументов

См. также описание функций fscanf(), printf() и sprintf().

Sscanf — Разбирает строку в соответствии с заданным форматом

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
или cc -std=c99

ОПИСАНИЕ

Если количество определителей преобразования в format превышает количество параметров указателей, то результат не определён. Если количество параметров указателей превышает количество определителей преобразования, то лишние параметры указатели вычисляются, но игнорируются.

Функция scanf() считывает информацию из стандартного потока ввода stdin; fscanf() считывает информацию из потока, на который указывает stream, а sscanf() считывает информацию из символьной строки, на которую указывает str.

Функция vfscanf() является аналогом vfprintf(3) и читает информацию из потока, на который указывает указатель stream, используя список указателей переменной длины (смотрите stdarg(3)). Функция vscanf() считывает список параметров переменной длины из стандартного ввода, а функция vsscanf() считывает его из строки. Эти функции являются аналогами функций vprintf(3) и vsprintf(3), соответственно.

Строка format состоит из последовательности инструкций (directives), которые описывают порядок обработки входных символов. Если обработка инструкции завершается с ошибкой, то чтение прекращается и scanf() завершает работу. «Отказом» может быть: ошибка ввода, то есть недоступность входных символов или ошибка совпадения, то есть получены неподходящие данные (смотрите далее).

Инструкцией может быть:

  • Последовательность пробельных символов (пробел, табуляция, символ новой строки и т. д.; смотрите isspace(3)). Эта инструкция совпадает с любым количеством пустого места, включая отсутствие данных.
  • Обычный символ (т. е., отличный от пробельного или «%»). Такой символ должен точно совпадать со следующим символом входных данных.
  • Определитель преобразования, который начинается с символа «%» (процент). Последовательность символов ввода преобразуется в соответствии с определителем, а результат помещается в соответствующий параметр указатель. Если следующий элемент ввода не соответствует определителю преобразования, то преобразование завершается с ошибкой — ошибкой совпадения.

Каждый определитель преобразования в format начинается с символа «%» или последовательности символов «%n$» (смотрите о разнице далее) за которым следует:

  • Необязательный символ подавления назначения «*»: scanf() читает данные как предписано определителем преобразования, но отбрасывает их. Соответствующий параметр указатель необязателен, и этот определитель не учитывается в счётчике успешных назначений, возвращаемом scanf().
  • Необязательный символ «m». Используется в строковых преобразованиях (%s, %c, %[) и освобождает вызывающего от необходимости выделять соответствующий буфер для хранения входных данных: вместо этого scanf() выделяет буфер достаточного размера и присваивает адрес этого буфера соответствующему параметру указателю, который должен быть указателем на переменную char * (эту переменную не нужно инициализировать перед вызовом). Вызывающий должен вызвать free(3) для этого буфера, как только он станет ненужным.
  • Необязательное целое десятичное число, которое задаёт максимальную ширину поля. Чтение символов прерывается по достижении этого максимума или при нахождении несовпадающего символа, неважно что случится раньше. В большинстве преобразований начальные пробельные символы отбрасываются (исключения приведены далее), и эти отброшенные символы не учитываются в максимальной ширине поля. В преобразованных строках ввода сохраняется конечный байт null (‘\0’) для отметки конца ввода; в максимальной ширине поля он также не учитывается.
  • Необязательный символ модификатора типа. Например, модификатор типа l используется в преобразованиях целых чисел, например с помощью %d, для указания того, что соответствующий параметр указатель ссылается на long int, а не на int.
  • Определитель преобразования, который задаёт тип входного преобразования.

Определители преобразования в format бывают двух видов: начинающиеся с «%» и начинающиеся с «%n$». Эти два вида не должны использоваться одновременно в строке format, за исключением случая, когда строка, содержащая определители «%n$», может включать %% и %*. Если в format содержатся определители «%», то они задаются в порядке появления параметров указателей, указанных после. В форме «%n$» (есть в POSIX.1-2001, но отсутствует в C99), n — это десятичное целое, которое задаёт в какое место должен быть помещён ввод, то есть указывает на расположение n-го параметра указателя, передаваемого после format.

Преобразования

Доступны следующие определители преобразования:

% Совпадает с литерой «%». То есть %% в строке формата соответствует одиночному символу данных «%». Преобразование не выполняется (но начальные пробельные символы отбрасываются) и назначения не происходит. d Совпадает с необязательным знаковым десятичным целым; следующий указатель должен быть указателем на int. D Эквивалентно ld; оставлено только для обратной совместимости (замечание: есть только в libc4. В libc5 и glibc %D просто игнорируется, что приводит к непонятным ошибкам в старых программах). i Совпадает с необязательным знаковым целым; следующий указатель должен быть указателем на int. Целое считывается как шестнадцатеричное число, если начинается с 0x или 0X, как восьмеричное, если начинается с и как десятичное в остальных случаях. Используются только символы, подходящие для работы с выбранным основанием системы счисления. o Совпадает с необязательным беззнаковым восьмеричным целым; следующий указатель должен быть указателем на unsigned int. u Совпадает с необязательным беззнаковым десятичным целым; следующий указатель должен быть указателем на unsigned int. x Совпадает с необязательным беззнаковым шестнадцатеричным целым; следующий указатель должен быть указателем на unsigned int. X Эквивалентно x. f Совпадает с необязательным знаковым числом с плавающей запятой; следующий указатель должен быть указателем на float. e Эквивалентно f. g Эквивалентно f. E Эквивалентно f. a (C99) Эквивалентно f. s Совпадает с последовательностью непробельных символов; следующий указатель должен указывать на первый элемент массива символов достаточной длины для сохранения входной последовательности и завершающего байта null (‘\0’), который добавляется автоматически. Входная строка обрывается при появлении пробельного символа или достижении максимальной ширины поля, неважно что случится раньше. c Совпадает с последовательностью символов, чья длина задаётся максимальной шириной поля (по умолчанию 1); следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов (завершающий байт null не добавляется). Обычный пропуск начальных пробелов не выполняется. Чтобы пропустить пробелы, явно укажите их в формате. [ Совпадает с непустой последовательностью символов из задаваемого набора допустимых символов; следующий указатель должен быть указателем на char и должно быть достаточно места для всех символов в строке плюс завершающий байт null. Обычный пропуск начальных пробелов не выполняется. Строка будет состоять (или нет) из символов определённого набора; набор задаётся указанием символов между символом открывающей скобки [ и закрывающей скобки ]. Набором определяются исключающиеся символы, если первым символом после открывающей скобки является символ диакритического знака (^). Чтобы включить закрывающую скобку в набор, укажите её первым символом после открывающей скобки или диакритического знака; в любой другой позиции она закрывает набор. Символ переноса также является специализированным; если он указывается между двумя символами, то в набор добавляются все лежащие в промежутке символы. Чтобы добавить в набор символ переноса укажите его последним, перед конечной закрывающей скобкой. Например, [^]0-9-] означает, что «все символы, кроме закрывающей скобки, цифр от 0 до 9 и переноса». Строка обрывается при появлении символа не из набора (или, при указании символа диакритического знака, из) или при достижении ширины поля. p Совпадает со значением указателя (как выводится при %p в printf(3)); следующий указатель должен быть указателем на void. n Ничего не ожидается; вместо этого количество символов, использованных к настоящему времени из ввода, сохраняется по следующему указателю, который должен быть указателем на int. Это не преобразование и не увеличивает счётчик, возвращаемый функцией. Назначение может подавляться при указании символа подавления назначения *, но влияние этого на возвращаемое значение не определено. Поэтому преобразования %*n лучше не использовать.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Если конец входных данных был достигнут раньше, чем произошло хотя бы одно совпадение или при ошибке совпадения возвращается значение EOF. Значение EOF также возвращается при ошибке чтения; в этом случае для потока устанавливается индикатор ошибки (смотрите ferror(3)), а в errno указывается номер ошибки.

Ввод-вывод в Си

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

Вывод информации

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

Общая форма записи функции printf() :

СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ — перевод строки;
  • ‘\t’ — горизонтальная табуляция;
  • ‘\v’ — вертикальная табуляция;
  • ‘\b’ — возврат на символ;
  • ‘\r’ — возврат на начало строки;
  • ‘\a’ — звуковой сигнал.

Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d — целое число типа int со знаком в десятичной системе счисления;
  • %u — целое число типа unsigned int ;
  • %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o — целое число типа int со знаком в восьмеричной системе счисления;
  • %hd — целое число типа short со знаком в десятичной системе счисления;
  • %hu — целое число типа unsigned short ;
  • %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld — целое число типа long int со знаком в десятичной системе счисления;
  • %lu — целое число типа unsigned long int ;
  • %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f — вещественный формат (числа с плавающей точкой типа float );
  • %lf — вещественный формат двойной точности (числа с плавающей точкой типа double );
  • %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c — символьный формат;
  • %s — строковый формат.

Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

Результат работы программы

Тот же самый код может быть представлен с использованием одного вызова printf :

sscanf, _sscanf_l, swscanf, _swscanf_l sscanf, _sscanf_l, swscanf, _swscanf_l

Считывают форматированные данные из строки. Read formatted data from a string. Существуют более безопасные версии этих функций; см. раздел sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l. More secure versions of these functions are available; see sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l.

Синтаксис Syntax

Параметры Parameters


buffer buffer
Сохраненные данные Stored data

format format
Строка управления форматом. Format-control string. Дополнительные сведения см. в разделе Спецификации формата. For more information, see Format Specifications.

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

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

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

Каждая из этих функций возвращает количество полей, которые были успешно преобразованы и присвоены; возвращаемое значение не включает поля, которые были считаны, но не были присвоены. Each of these functions 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. Возвращаемое значение — EOF для ошибки или, если конец строки достигнут перед первым преобразованием. The return value is EOF for an error or if the end of the string is reached before the first conversion.

Если buffer или Format является пустым указателем, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If buffer or format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают-1 и устанавливают для еинвалзначение. If execution is allowed to continue, these functions return -1 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

Функция sscanf считывает данные из буфера в расположение, заданное каждым аргументом. The sscanf function reads data from buffer into the location given by each argument. Каждый аргумент должен быть указателем на переменную с типом, который соответствует спецификатору типа в формате. Every argument must be a pointer to a variable with a type that corresponds to a type specifier in format. Аргумент Format управляет интерпретацией полей ввода и имеет ту же форму и функцию, что и аргумент Format для функции scanf . The format argument controls the interpretation of the input fields and has the same form and function as the format argument for the scanf function. Если копирование производится между перекрывающимися строками, поведение не определено. If copying takes place between strings that overlap, the behavior is undefined.

Дополнительные сведения об символах поля типа scanf см. в разделе символы поля типа scanf. For information about scanf type field characters, see scanf Type Field Characters. Сведения о полях спецификации формата scanf см. в разделе поля спецификации формата. For information about scanf format specification fields, see Format Specification Fields.

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

swscanf — это версия sscanfдля расширенных символов; аргументы для swscanf являются строками расширенных символов. swscanf is a wide-character version of sscanf; the arguments to swscanf are wide-character strings. sscanf не обрабатывает многобайтовые шестнадцатеричные символы. sscanf does not handle multibyte hexadecimal characters. swscanf не обрабатывает символы в формате полной ширины в Юникоде или «зоны совместимости». swscanf does not handle Unicode full-width hexadecimal or «compatibility zone» characters. В противном случае поведение swscanf и sscanf работает одинаково. Otherwise, swscanf and sscanf behave identically.

Версии этих функций с суффиксом _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
_stscanf _stscanf sscanf sscanf sscanf sscanf swscanf swscanf
_stscanf_l _stscanf_l _sscanf_l _sscanf_l _sscanf_l _sscanf_l _swscanf_l _swscanf_l

Требования Requirements

Подпрограмма Routine Обязательный заголовок Required header
sscanf, _sscanf_l sscanf, _sscanf_l
swscanf, _swscanf_l swscanf, _swscanf_l или or

Дополнительные сведения о совместимости см. в разделе Совместимость. For additional compatibility information, see Compatibility.

Scanf() для строки любого размера

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

14.09.2015, 20:44

Можно ли в cin ввести строку любого размера?
Собственно можно ли в cin ввести строку неопределенного размера, пользуясь только char * .

Как считывать scanf’ом только до конца строки
Люди, ссори за нубизм, но как сделать так,чтобы при считывании использовать только функцию scanf и.

Как создать приложение для любого размера экрана?
При создании нового приложения в XE5 надо выбрать устройство или размер экрана. Кто-нибудь знает.

Код для простейшей программы деления и слияния любого файла на любое количество частей разного размера
Уважаемое сообщество. Необходим код для простейшей программы деления и слияния любого файла на.

Вычислить определитель матрицы любого размера
Необходимо вычислить определитель матрицы любого размера

PHP sscanf() Function

sscanf() функция анализирует входные данные из строки в соответствии с заданным форматом. sscanf() функция анализирует строку в переменные на основании строки формата.

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

  • printf() — выводит отформатированную строку
  • sprintf() — записывает отформатированную строку в переменную

Синтаксис

параметр Описание
string Необходимые. Задает строку для чтения
format Необходимые. Определяет формат для использования.

Возможные значения формата:

  • %% — Возвращает знак процента
  • % С — Символ в соответствии со значением ASCII
  • % d — Подпись десятичное число (negative, zero or positive)
  • % е — Экспоненциальное с использованием нижнего регистра (eg 1.2e+2)
  • % U — десятичное число без знака (equal to or greather than zero)
  • % F — число с плавающей точкой
  • % О — восьмеричное число
  • % S — строка
  • % х — шестнадцатеричное число (lowercase letters)
  • % X — шестнадцатеричное число (uppercase letters)

Дополнительные значения формата. Они размещаются между% и буквой (example %.2f) , (example %.2f) :

  • + (силы как + и — перед числами По умолчанию только отрицательные числа помечаются.)
  • «(Указывает , что использовать в качестве дополнения по умолчанию пространство должно быть использовано вместе с шириной спецификатора Пример. %» X20s (this uses «x» as padding) в (this uses «x» as padding)
  • — (Left-justifies the variable value)
  • [0-9] (Specifies the minimum width held of to the variable value)
  • . [0-9] (Определяет число десятичных цифр или максимальной длины строки)

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

arg1 Необязательный. Первая переменная для хранения данных в
arg2 Необязательный. Вторая переменная для хранения данных в
arg++ Необязательный. Третий, четвертый и так далее, чтобы хранить данные в

Технические подробности

Возвращаемое значение: Если только два параметра передаются в эту функцию, данные будут возвращены в виде массива. В противном случае, если передаются необязательные параметры, данные разобранные сохраняются в них. Если есть больше, чем спецификаторов переменных, содержащих их, возникает ошибка. Однако, если есть меньше спецификаторов, чем переменные, то лишние переменные содержат NULL.
PHP версии: 4.0.1+

Еще примеры

Пример 1

Использование значений формата% S,% d и% C:

Документация

Считайте отформатированные данные из строк

Синтаксис

Описание

A = sscanf(str,formatSpec) считывает данные из str , преобразовывает его согласно формату, заданному formatSpec , и возвращает результаты в массиве. str является или символьным массивом или скаляром строки. Функция sscanf неоднократно применяет formatSpec к последовательностям символов в str до него или достигает конца str или не удается совпадать с formatSpec к последовательности символов. Если str является символьным массивом больше чем с одной строкой, sscanf читает символы в порядке следования столбцов.

A = sscanf(str,formatSpec,sizeA) устанавливает размер выходного массива быть sizeA и затем считывает данные из str в выходной массив. sizeA должен быть положительным целым числом или иметь форму [m n] , где m и n являются положительными целыми числами.

[A,n] = sscanf(___) также возвращает число элементов, которое sscanf успешно читает в A .

[A,n,errmsg] = sscanf(___) также возвращает вектор символов, содержащий сообщение об ошибке, когда sscanf не удается считать все данные в A . Если sscanf успешно выполняется, то errmsg является пустым символьным вектором.

[A,n,errmsg,nextindex] = sscanf(___) также возвращает индекс положения в str , который сразу следует за последним знаком, отсканированным sscanf .


Примеры

Преобразование вектора символа в числа

Создайте вектор символов, который представляет несколько чисел, разделенных пробельными символами. Преобразуйте вектор символов в вектор — столбец чисел. sscanf обрабатывает пробельные символы как разделители между числами.

Преобразование текста и Изменение размеров выходного массива

Создайте строку, которая представляет несколько чисел, и преобразуйте ее с помощью sscanf . Задайте размер выходного массива.

Начиная в R2020a, можно создать строки с помощью двойных кавычек.

Преобразуйте str в матрицу 2 на 2. Поскольку str представляет только три числа, sscanf заполняет A достаточно, обнуляет, чтобы заполнить матрицу.

Подсчет элементов найденными в тексте

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

Начиная в R2020a, можно создать строки с помощью двойных кавычек.

Считайте элементы в выходном массиве A . Преобразуйте числа в строке с помощью оператора %d . %d совпадает с целыми числами, разделенными пробелом. Чтобы возвратить число элементов в A , задайте второй выходной аргумент.

Отображение сообщения об ошибке

Создайте строку и считайте данные из них. Когда sscanf не удается преобразовать всю входную строку, отобразить сообщение об ошибке.

Начиная в R2020a, можно создать строки с помощью двойных кавычек.

Преобразуйте номер в str . Поскольку str также содержит символы, с которыми не может совпадать %f , sscanf возвращает сообщение об ошибке. sscanf прекращает обрабатывать, как только он сталкивается со словом ‘are’ , потому что он не может быть преобразован в номер.

Возврат отсканированной последней позиции

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

Преобразуйте данные в chr . Возвратите индекс.

Отобразите символы от chr , который не отсканировал sscanf .

Соответствие с заданными символами

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

Начиная в R2020a, можно создать строки с помощью двойных кавычек. Чтобы вставить символ степени ( char(176) ), используйте функцию insertBefore .

Возвратите температуры как числовой массив.

Входные параметры

str Введите текст, чтобы отсканировать
символьный массив | представляет скаляр в виде строки

Введите текст, чтобы отсканировать, заданный как символьный массив или представить скаляр в виде строки. Если str является символьным массивом, то он может иметь несколько строк, и sscanf читает символы в порядке следования столбцов.

Типы данных: char | string

formatSpec Формат полей ввода
форматирование операторов

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

Эта таблица приводит доступные спецификаторы преобразования, чтобы преобразовать текст в числовые выходные параметры. sscanf преобразовывает значения в их десятичное число (базируйтесь 10), представление.

Числовой тип поля

Целое число, подписанное

Значения определяют основу:

Значение по умолчанию основное 10.

Если начальными цифрами является 0x или 0X , то значения основные 16 (шестнадцатеричный).

Если начальной цифрой является 0 , то значения основные 8 (восьмеричный).

64-битные значения, основа 10, 8, или 16.

Целое число, без знака

Базируйтесь 8 (восьмеричный).

Базируйтесь 16 (шестнадцатеричный).

64-битные значения, основа 10, 8, или 16.

Число с плавающей запятой

Значения с плавающей точкой. Поля ввода могут содержать любое из следующих (не чувствительный к регистру): Inf , -Inf , NaN или -NaN . Поля ввода, которые представляют числа с плавающей запятой, могут включать ведущий + или символы — и экспоненциальное представление с помощью e или E . Спецификаторы преобразования %f , %e и %g все поля ввода обработки тот же путь.

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

Тип символьного поля

Вектор символов или скаляр строки

Считайте текст до пробела обнаружения sscanf .

Считайте любой отдельный символ, включая пробел.
Чтобы считать несколько символов за один раз, задайте ширину поля. Например, %10c читает 10 символов за один раз.

Сопоставление с образцом

Символы только для чтения в скобках до первого символа несоответствия или пробела.

Пример: %[mus] читает ‘summer ‘ как ‘summ’ .

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

Поля и символы, чтобы проигнорировать

sscanf читает все числовые значения и символы в последовательности, если вы не говорите ему игнорировать конкретное поле или фрагмент поля. К полям игнорируемых данных вставьте звездочку ( * ) после знака процента ( % ). Например, чтобы пропустить целые числа, задайте %*d .

Чтобы задать максимальное количество цифр или текстовых символов, чтобы читать за один раз, вставьте номер после символа процента. Например, %10c читает до 10 символов за один раз, включая пробел. %4f читает до четырех цифр за один раз, включая десятичную точку.


Буквенный текст, чтобы проигнорировать

sscanf сразу игнорирует заданный текст прежде или после спецификатора преобразования.

Пример: Level%u читает ‘Level1’ как 1 .

Пример: %uStep читает ‘2Step’ как 2 .

Типы данных: char | string

sizeA Размерности выходного массива
Inf (значение по умолчанию) | целое число | двухэлементный вектор — строка

Размерности выходного массива, A , заданного как Inf , положительное целое число или двухэлементный вектор — строка.

Форма входа sizeA

Считайте вход в конец.
Для числовых данных A является вектором — столбцом.
Для текстовых данных A является вектором символов.

Читайте в большинстве числовых значений n или разграниченных пробелом символьных полей.
Для числовых данных A является вектором — столбцом.
Для текстовых данных A является вектором символов.

Читайте в большинстве числовых значений m*n или символьных полей. n может быть Inf , но m не может. A является m -by- n , заполнил порядка следования столбцов.

Типы данных: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Выходные аргументы

A Выходные данные
вектор — столбец | матрица | символьный массив

Выходные данные, возвращенные как вектор — столбец, матрица или символьный массив. Класс и размер A зависят от преобразований, заданных formatSpec и размером выходного массива, заданного sizeA :

Если formatSpec содержит только числовые спецификаторы, то A является числовым вектором — столбцом. Если вы также задаете аргумент sizeA , то A является матрицей заданного размера и дополнен, обнуляет при необходимости. Если вход содержит меньше, чем значения sizeA , то размер A меньше, чем sizeA . Вместо этого это — размер, требуемый сохранить значения, отсканированные от входа.

Если formatSpec содержит только 64-битные спецификаторы целого числа со знаком, то A имеет класс int64 .

Если formatSpec содержит только 64-битные спецификаторы беззнаковых целых чисел, то A имеет класс uint64 .

В противном случае A имеет класс double .

Если formatSpec содержит только %c или спецификаторы %s , то A является вектором символов. Если вы также задаете sizeA , то A является символьным массивом и дополнен по мере необходимости с нулевыми символами. (Нулевой символ является управляющим символом с нулем значения.), Если вход содержит меньше, чем символы sizeA , то размер A меньше, чем sizeA . Вместо этого это — размер, требуемый сохранить символы, отсканированные от входа.

Если formatSpec содержит комбинацию числовых и символьных спецификаторов, то A является числовым класса double , и sscanf преобразовывает каждый символ в свой числовой эквивалент. Это преобразование происходит, даже когда formatSpec явным образом пропускает все числовые поля (например, formatSpec является ‘%*d %s’ ).

Если sscanf не может совпадать со всем входом к formatSpec , то A может быть числовым или символьный массив. Класс A зависит от значений, которые читает sscanf , прежде чем это прекратит обрабатывать.

Типы данных: double | int64 | uint64 | char

sscanf

Преобразует форматированный ввод, указанный в виде строки. Эта функция устарела.

Последовательность вызова

Аргументы

определяет формат преобразования.

определяет ввод, который следует прочитать

Описание

Функция sscanf интерпретирует символьную строку в соответствии с форматом format , и возвращает результаты преобразования v_1 , . v_n .

Параметр format содержит спецификации преобразования, используемые для интерпретации ввода.

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

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

Спецификация преобразования, которая направляет преобразование следующего входного поля. См. подробности в преобразовании scanf.

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

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

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

Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ.
int printf (const char * format, . );

Функция проходит по строке и заменяет первое вхождение % на первый аргумент, второе вхождение % на второй аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.

Общий синтаксис спецификатора формата
%[флаги][ширина][.точность][длина]спецификатор
Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.

Таб. 1 Спецификатор типа.

Спецификатор Что хотим вывести Пример
d или i Целое со знаком в в десятичном виде 392
u Целое без знака в десятичном виде 7235
o Беззнаковое в восьмеричном виде 657
x Беззнаковое целое в шестнадцатеричном виде 7fa
X Беззнаковое целое в шестнадцатеричном виде, верхний регистр 7FA
f или F Число с плавающей точкой 3.4563745
e Экспоненциальная форма для числа с плавающей точкой 3.1234e+3
E Экспоненциальная форма для числа с плавающей точкой, верхний регистр 3.1234E+3
g Кратчайшее из представлений форматов f и e 3.12
G Кратчайшее из представлений форматов F и E 3.12
a Шестнадцатеричное представление числа с плавающей точкой -0xc.90fep-2
A Шестнадцатеричное представление числа с плавающей точкой, верхний регистр -0xc.90FEP-2
c Буква a
s Строка (нуль-терминированный массив букв) Hello World
p Адрес указателя b8000000
n Ничего не пачатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n
% Два идущих друг за другом процента выводят знак процента %

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

Таб. 2 Флаги.

Флаг Описание
Выключка влево на заданное шириной значение
+ Явно указывать знак у числа, даже для положительных чисел
(пробел) Если знак не будет выведен, то вставляет пробел перед выводимым числом
# Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X
Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков.
Вставляет нули, когда объявлен спецификатор ширины
Таб. 3 Ширина.
Ширина Описание
(число) Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули)
* Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу
Таб. 4 Точность.
.Точность Описание
.число Для спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче, то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится.
Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6).
Для g и G — это число значащих разрядов, которые необходимо вывести.
Для s — выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого.
Если число не стоит, то по умолчанию точность равна 0
.* Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

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

Таб. 5 Длина.

спецификаторы
Длина d, i u o x X f F e E g G a A c s p n
(none) int unsigned int double int char* void* int*
hh signed char unsigned char signed char*
h short int unsigned short int short int*
l long int unsigned long int wint_t wchar_t* long int*
ll long long int unsigned long long int long long int*
j intmax_t uintmax_t intmax_t*
z size_t size_t size_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
L long double

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

Рассмотрим форматированный ввод функцией scanf.
int scanf(const char*, . )
Функция принимает строку формата ввода (она похожа на строку формата printf) и адреса, по которым необходимо записать считанные данные. Возвращает количество успешно проинициализированных аргументов.
Формат спецификатора ввода
%[*][ширина][длинна]спецификатор

Таб. 6 Спецификатор типа.

Спецификатор Описание Выбранные символы
i, u Целые Произвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном.
d Десятичное целое Произвольное число цифр (0-9), возможно, начинающихся с + или -.
o восьмеричное целое Произвольное число цифр (0-7), возможно, начинающихся с + или -.
x Шестнадцатеричное целое Произвольное число цифр (0-F), возможно, начинающихся с + или — и префикса 0x или 0X.
f, e, g Число с плавающей точкой Число, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате.
a
c Символ Если ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце.
s Строка Считывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный.
p Адрес указателя Последовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p
[символы] Множество символов Считывает только те символы, которые записаны в квадратных скобках, С99
[^символы] Множество символов Считывает только те символы, которые не указаны в квадратных скобках, С99
n Ничего не считывает Сохраняет число уже считанных символов по указанному адресу

Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким флагом функции printf.

Кроме функций scanf и printf есть ещё ряд функций, которые позволяют получать вводимые данные

int getch() [aka _getch(), getchar()] — возвращает введённый символ, при этом не выводит его на консоль.

char * fgets ( char * str, int num, FILE * stream ) — функция позволяет считывать строку с пробельными символами. Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.

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

Непечатные символы

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

Илон Маск рекомендует:  Что такое код mssql_connect
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL