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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по