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
, ll
l
, I64
и L
указывают размер argument
(длинный или короткий, однобайтовый символ или широкий символ в зависимости от символа типа, который они изменяют). Эти символы спецификации формата используются с символами типа в функциях scanf
и wscanf
для определения интерпретации аргументов, как показано в следующей таблице. Префикс I64
типа является расширением Майкрософт и несовместимо со стандартом C. Символы типа и их значения описаны в таблице "Символы типов для функций сканирования" в 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 |
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_l
wscanf
_wscanf_l
scanf_s
, , _scanf_s_l
wscanf_s
_wscanf_s_l
Форматирование полей спецификации: scanf
и wscanf
функций
scanf
Символы полей типа