printf_s
, , _printf_s_l
wprintf_s
_wprintf_s_l
Выводит форматированные выходные данные в стандартный поток вывода. Эти версии , _wprintf_l
_printf_l
wprintf
имеют улучшения безопасности, как описано в функциях printf
безопасности в CRT.
Синтаксис
int printf_s(
const char *format [,
argument]...
);
int _printf_s_l(
const char *format,
_locale_t locale [,
argument]...
);
int wprintf_s(
const wchar_t *format [,
argument]...
);
int _wprintf_s_l(
const wchar_t *format,
_locale_t locale [,
argument]...
);
Параметры
format
Формат объекта.
argument
Необязательные аргументы.
locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращает число выведенных символов или отрицательное значение в случае ошибки.
Замечания
Функция printf_s
форматирует и выводит последовательность символов и значений в стандартный поток вывода, stdout
. Если за строкой format
следуют аргументы, строка format
должна содержать спецификации, которые определяют формат вывода для аргументов.
Основное различие между printf_s
и printf
заключается в том, что printf_s
проверяет строку форматирования на наличие допустимых символов форматирования, тогда как printf
только проверяет, является ли строка форматирования пустым указателем. Если проверка завершается ошибкой, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров". Если выполнение может быть продолжено, функция возвращает -1 и устанавливает errno
в значение EINVAL
.
Сведения о errno
кодах ошибок и см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
printf_s
и fprintf_s
ведет себя одинаково, за исключением того, что printf_s
выходные данные stdout
записываются вместо назначения типа FILE
. Дополнительные сведения см. в разделе fprintf_s
, _fprintf_s_l
, fwprintf_s
. _fwprintf_s_l
Функция wprintf_s
— это версия printf_s
с расширенными символами; format
— строка расширенных символов. wprintf_s
и printf_s
ведут себя одинаково, если поток открыт в режиме ANSI. Функция printf_s
на данный момент не поддерживает вывод данных в поток в кодировке Юникод.
Версии этих функций с суффиксом _l
идентичны за исключением того, что они используют переданный параметр языкового стандарта вместо языкового стандарта текущего потока.
Сопоставления подпрограмм универсального текста
TCHAR.H рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_tprintf_s |
printf_s |
printf_s |
wprintf_s |
_tprintf_s_l |
_printf_s_l |
_printf_s_l |
_wprintf_s_l |
Аргумент format
состоит из обычных символов, escape-последовательностей и (если за format
следуют аргументы) спецификаций формата. Обычные символы и escape-последовательности копируются в stdout
в порядке их отображения. Например, в строке
printf_s("Line one\n\t\tLine two\n");
выводятся следующие выходные данные
Line one
Line two
Спецификации формата всегда начинаются со знака процента (%
) и читаются слева направо. Когда функция printf_s
обнаруживает первую спецификацию формата (если таковые имеются), она преобразует значение первого после format
аргумента и выводит его соответствующим образом. Вторая спецификация формата вызывает преобразование второго аргумента и его вывод и т. д. Если число аргументов превышает количество спецификаций формата, лишние аргументы игнорируются. Результаты не определены, если для всех спецификаций формата недостаточно аргументов.
Внимание
Убедитесь, что format
не является строкой, определяемой пользователем.
Начиная с Windows 10 версии 2004 (сборка 19041), printf
семейство функций выводит точно представленные числа с плавающей запятой в соответствии с правилами IEEE 754 для округления. В предыдущих версиях Windows точно представленные числа с плавающей запятой, заканчивающиеся на "5", всегда округлялись. IEEE 754 утверждает, что они должны округлиться до ближайшей даже цифры (также известной как "Округление банкира"). Например, оба printf("%1.0f", 1.5)
и printf("%1.0f", 2.5)
должны округлиться до 2. Ранее 1,5 округляет до 2 и 2,5 округления до 3. Это изменение влияет только на точно представленные числа. Например, 2.35 (который при представлении в памяти приближается к 2,3500000000000000008) продолжает округляется до 2,4. Округление, выполняемое этими функциями, теперь также учитывает режим округления с плавающей запятой, заданный fesetround
. Ранее округление всегда выбрало FE_TONEAREST
поведение. Это изменение влияет только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее поведение округления с плавающей запятой, свяжите со legacy_stdio_float_rounding.obj
ссылкой.
Требования
Маршрут | Обязательный заголовок |
---|---|
printf_s , _printf_s_l |
<stdio.h> |
wprintf_s , _wprintf_s_l |
<stdio.h> или <wchar.h> |
Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdin
stdout
и stderr
, должны быть перенаправлены перед тем, как функции времени выполнения C могут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в разделе Совместимость.
Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdin
stdout
и stderr
, должны быть перенаправлены перед тем, как функции времени выполнения C могут использовать их в приложениях UWP. Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_printf_s.c
/* This program uses the printf_s and wprintf_s functions
* to produce formatted output.
*/
#include <stdio.h>
int main( void )
{
char ch = 'h', *string = "computer";
int count = -9234;
double fp = 251.7366;
wchar_t wch = L'w', *wstring = L"Unicode";
/* Display integers. */
printf_s( "Integer formats:\n"
" Decimal: %d Justified: %.6d Unsigned: %u\n",
count, count, count );
printf_s( "Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n",
count, count, count, count );
/* Display in different radixes. */
printf_s( "Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n",
0x10, 010, 10 );
/* Display characters. */
printf_s("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch, wch);
wprintf_s(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch, wch);
/* Display strings. */
printf_s("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n",
string, string, wstring, wstring);
wprintf_s(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n",
string, string, wstring, wstring);
/* Display real numbers. */
printf_s( "Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );
/* Display pointer. */
printf_s( "\nAddress as: %p\n", &count);
}
Пример полученных результатов
Integer formats:
Decimal: -9234 Justified: -009234 Unsigned: 4294958062
Decimal -9234 as:
Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756
Digits 10 equal:
Hex: 16 Octal: 8 Decimal: 10
Characters in field (1):
h h w w
Characters in field (2):
h h w w
Strings in field (1):
computer
comp
Unicode Uni
Strings in field (2):
computer
comp
Unicode Uni
Real numbers:
251.736600 251.74 2.517366e+002 2.517366E+002
Address as: 0012FF78
См. также
Поддержка математических и плавающих точек
Потоковый ввод-вывод
Локаль
fopen
, _wfopen
fprintf
, , _fprintf_l
fwprintf
_fwprintf_l
scanf
, , _scanf_l
wscanf
_wscanf_l
sprintf
, , _sprintf_l
swprintf
, _swprintf_l
__swprintf_l
Функции vprintf