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

 

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

Сведения отсюда применяются ко всему семейству функций 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

Показ: