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


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

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

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

width Поле

Поле 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 символы маркера записываются в целевую строку вместе с конечным терминатором NULL.

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

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

Примечание.

Префиксы hlи 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
long long ll d, i, o, x или X
short int h d, i, o, x или X
short unsigned int h u
char hh d, i, o, x или X
unsigned char hh 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(L"%hC", &x, 2);    // Read a single-byte character

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

Чтение неустранимых строк

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

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

Чтение нетерминированных строк

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

При scanf остановке чтения поля

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

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

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

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

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

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

См. также

scanf, , _scanf_lwscanf_wscanf_l
scanf_s, , _scanf_s_lwscanf_s_wscanf_s_l
Форматирование полей спецификации: scanf и wscanf функций
scanf Символы полей типа