scanf_s
, , _scanf_s_l
wscanf_s
_wscanf_s_l
Считывает отформатированные данные из стандартного входного потока. Эти версии , _wscanf_l
_scanf_l
wscanf
имеют улучшения безопасности, как описано в функциях scanf
безопасности в CRT.
Синтаксис
int scanf_s(
const char *format [,
argument]...
);
int _scanf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wscanf_s(
const wchar_t *format [,
argument]...
);
int _wscanf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Параметры
format
Строка управления форматированием.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает количество полей, успешно преобразованных и назначенных. Возвращаемое значение не включает поля, которые были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не назначены. Возвращаемое значение является EOF
ошибкой или если символ конца файла или символ конца строки найден в первой попытке считывания символа. Если format
это NULL
указатель, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, то функции scanf_s
и wscanf_s
возвращают ошибку EOF
и устанавливают для errno
значение EINVAL
.
Сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Функция scanf_s
считывает данные из стандартного входного потока stdin
и записывает его в argument
. Каждый из них argument
должен быть указателем на тип переменной, соответствующий описательу типов.format
Если копирование производится между перекрывающимися строками, поведение не определено.
wscanf_s
— это версия scanf_s
с расширенными символами; аргумент format
для wscanf_s
— строка расширенных символов. wscanf_s
и scanf_s
ведут себя одинаково, если поток открыт в режиме ANSI. scanf_s
сейчас не поддерживает ввод из потока ЮНИКОДА.
Версии этих функций с суффиксом идентичны, за исключением того, что _l
они используют locale
параметр вместо текущего языкового стандарта потока.
В отличие scanf
от и wscanf
, scanf_s
и wscanf_s
требуется указать размер буфера для некоторых параметров. Укажите размеры для всех параметров набора элементов управления, а s
S
также для всех c
, или C
строковых элементов []
управления. Размер буфера в символах передается в качестве другого параметра. Он сразу же следует указателю на буфер или переменную. Например, если вы читаете строку, размер буфера для этой строки передается следующим образом:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
Размер буфера содержит значение NULL терминала. Можно использовать поле спецификации ширины, чтобы убедиться, что маркер, который считывается в буфере. Если маркер слишком велик, ничего не записывается в буфер, если не существует спецификации ширины.
Примечание.
Параметр размера имеет тип unsigned
, а не size_t
. Для преобразования значения size_t
в значение unsigned
для 64-разрядной конфигурации сборки следует использовать static_cast.
Параметр размера буфера описывает максимальное количество символов, а не байтов. В этом примере ширина типа буфера не соответствует ширине описателя формата.
wchar_t ws[10];
wscanf_s(L"%9S", ws, (unsigned)_countof(ws));
Описатель S
формата означает использование ширины символов, которая является противоположной ширине по умолчанию, поддерживаемой функцией. Ширина символа — однобайт, но функция поддерживает двойные байты. Этот пример считывает строку до девяти однобайтовых символов и помещает их в буфер двухбайтовых символов. Символы обрабатываются как однобайтовые значения; первые два символа сохраняются в ws[0]
, вторые два сохраняются в ws[1]
и т. д.
В этом примере считывается один символ:
char c;
scanf_s("%c", &c, 1);
При чтении нескольких символов для строк, отличных от NULL, целые числа используются как для спецификации ширины, так и для размера буфера.
char c[4];
scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated
Дополнительные сведения см. в разделе scanf
"Спецификация ширины".
Сопоставления подпрограмм универсального текста
TCHAR.H рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_tscanf_s |
scanf_s |
scanf_s |
wscanf_s |
_tscanf_s_l |
_scanf_s_l |
_scanf_s_l |
_wscanf_s_l |
Дополнительные сведения см. в полях спецификации форматирования: scanf
и wscanf
функций.
Требования
Маршрут | Обязательный заголовок |
---|---|
scanf_s , _scanf_s_l |
<stdio.h> |
wscanf_s , _wscanf_s_l |
<stdio.h> или <wchar.h> |
Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потоков и stderr
должны быть перенаправлены перед тем, как функции времени выполнения C могут использовать их в приложениях stdin
stdout
UWP. Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_scanf_s.c
// This program uses the scanf_s and wscanf_s functions
// to read formatted input.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int i,
result;
float fp;
char c,
s[80];
wchar_t wc,
ws[80];
result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
printf( "The number of fields input is %d\n", result );
printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,
wc, s, ws);
result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,
&wc, 1, s, (unsigned)_countof(s), ws, (unsigned)_countof(ws) );
wprintf( L"The number of fields input is %d\n", result );
wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,
c, wc, s, ws);
}
Эта программа создает следующие выходные данные для этих входных данных:
71 98.6 h z Byte characters
36 92.3 y n Wide characters
The number of fields input is 6
The contents are: 71 98.599998 h z Byte characters
The number of fields input is 6
The contents are: 36 92.300003 y n Wide characters
См. также
Поддержка математических и плавающих точек
Потоковый ввод-вывод
Локаль
fscanf
, , _fscanf_l
fwscanf
_fwscanf_l
printf
, , _printf_l
wprintf
_wprintf_l
sprintf
, , _sprintf_l
swprintf
, _swprintf_l
__swprintf_l
sscanf
, , _sscanf_l
swscanf
_swscanf_l