Форматирование полей спецификации: scanf и wscanf функций

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

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

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

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

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

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

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

    Здесь, , widthhlllI64и представляет scanfспецификацию ширины и typeL представляет scanfсимвол поля типа.

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

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

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

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

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

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

Безопасные версии (те, с суффиксом_s) scanf семейства функций требуют, чтобы каждый параметр типа c, SCsили [ был передан сразу после этого параметр размера буфера. Дополнительные сведения о безопасных версиях 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