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

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

Спецификация width состоит из символов между % и описателем типа поля, который может содержать целое положительное число, называемое полем ширины, и одним или несколькими символами, указывающими размер поля, которые также могут считаться модификаторами типа поля, например показывать, является ли целочисленный тип типом short или long. Эти символы называются префиксами размера.

Поле width

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

Спецификация ширины отдельна и отличается от аргумента размер буфера, требуемого безопасными версиями этих функций (например, scanf_s, wscanf_s и т д). В следующем примере, спецификация ширины равна 20, что означает, что до 20 символов могут быть прочитаны из входного потока. Длина буфера 21, что включает место для возможных 20 символов плюс завершающий нуль-символ:

char str[21];
scanf_s("%20s", str, 21);

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

Префикс размера

Необязательные префиксы h, l, ll, I64 и L указывают размер argument (long или short, однобайтовый символ или расширенный символ, в зависимости от символа типа, который они изменяют). Эти символы спецификации формата используются с символами типа в функциях scanf или wscanf для определения интерпретации аргументов, как показано в следующей таблице. Префикс типа I64 является расширением Майкрософт и не совместим с ANSI. Символы типа и их значения описаны в таблице «Символы типа для функций scanf» в разделе Символы поля типа scanf.

Примечание

Префиксы h, l и L - расширения Майкрософт, когда они используются с данными типа char.

Префиксы размера для описателей типа формата scanf и wscanf

Указать

Используемый префикс

Со спецификатором типа.

double

l

e, E, f, g или G

long double (то же, что и double)

L

e, E, f, g или G

long int

l

d, i, o, x или X

long unsigned int

l

u

длинное длинное

ll

d, i, o, x или X

short int

h

d, i, o, x или X

short unsigned int

h

u

__int64

I64

d, i, o, u, x или X

Однобайтовый символ с scanf

h

c или C

Однобайтовый символ с wscanf

h

c или C

Расширенный символ с scanf

l

c или C

Расширенный символ с wscanf

l

c или C

Строка однобайтовых символов с scanf

h

s или S

Строка однобайтовых символов с wscanf

h

s или S

Строка расширенных символов с scanf

l

s или S

Строка расширенных символов с wscanf

l

s или S

В следующих примерах используются h и l с функциями scanf_s и функциями wscanf_s:

scanf_s( "%ls", &x, 2 );     // Read a wide-character string
wscanf_s( "%hC",&x, 2 );    // Read a single-byte character

При использовании небезопасной функции из семейства scanf, опустите параметр размера, указывающий длину буфера предыдущего аргумента.

Чтение неразделенных строк

Для чтения строки, не разделенной пробельными символами, набор символов в квадратных скобках ([ ]) может быть замещен символом типа s (строка). Набор символов в квадратных скобках называется строкой управления. Соответствующее поле ввода считывается до первого символа, который не появился в строке управления. Если первый символ в наборе - символ каретки (^), то результат обращается: Поле ввода считываются до первого символа, который есть в остальной части набора символов.

Обратите внимание, что %[a-z] и %[z-a] интерпретируются как эквивалент %[abcde...z]. Это общее расширения функции scanf, но следует заметить, что стандарт ANSI не требует его.

Чтение незавершенной строки

Чтобы сохранить строку без сохранения конечного нуль-символа ('\0'), используйте спецификацию %nc, где n десятичное целое число. В этом случае символ типа c указывает, что аргумент - указатель на массив символов. Следующие n символов считываются из входного потока в указанное место, и нуль-символ ('\0') не добавляется. Если n не указано, значение по умолчанию равно 1.

Когда scanf останавливает чтения поля

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

  • Достигнута указанная ширина.

  • Следующий символ не может быть преобразован указанным образом.

  • Следующий символ конфликтует с символом в строке управления, которой он должен соответствовать.

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

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

См. также

Ссылки

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

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

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