Поделиться через


Поля спецификации формата. Функции scanf и wscanf

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

Спецификация формата имеет следующий вид:

%[*] [width] [{h | l | ll | I64 | L}]type

Аргумент format определяет интерпретацию входных данных и может содержать один или несколько из следующих символов:

  • Пробельные символы: пробел (' '); символ табуляции ('\t'); новая строка ('\n'). Пробельные символы приводят к тому, что scanf считывает, но не хранит все последовательные пробельные символы в входных данных до следующего символа, отличного от пробельного. Один символ пробела в формате соответствует любому числу (включая 0) и сочетанию символов пробела во входных данных.

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

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

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

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

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

Каждое поле спецификации формата представляет собой символ или число, указывающее на определенный параметр формата. Символ type, который отображается после последнего необязательного поля формата, указывает на то, интерпретировать ли поле ввода как символ, строку или число.

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

Звездочка (*) за знаком процента отключает назначение следующего поля ввода, которое интерпретируется как поле указанного типа. Поле сканируется, но не сохраняется.

Безопасные версии (с суффиксом _s) семейства функций scanf требуют, чтобы параметр размера буфера был передан сразу после каждого параметра типа c, C, s, S или [. Дополнительные сведения о безопасных версиях семейства функций scanf см. в разделе scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l.

См. также

Ссылки

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

Символы поля типа scanf

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l