printf_s
、 、 _printf_s_l
、 wprintf_s
_wprintf_s_l
將格式化輸出列印至標準輸出資料流。 這些版本的printf
、 _printf_l
、 wprintf
_wprintf_l
具有安全性增強功能,如 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
只檢查格式字串是否為 null 指標。 如果任一檢查失敗,則會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行,則函式會傳回 -1 並將 errno
設定為 EINVAL
。
如需和錯誤碼的相關資訊errno
,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
printf_s
和 fprintf_s
的行為相同,不同之處在於 printf_s
將輸出寫入 至 stdout
,而不是寫入 類型的 FILE
目的地。 如需詳細資訊,請參閱 、 、 _fprintf_s_l
fwprintf_s
_fwprintf_s_l
。fprintf_s
wprintf_s
是寬字元版本的 printf_s
;format
是寬字元字串。 如果資料流在 ANSI 模式中開啟,則 wprintf_s
和 printf_s
的行為相同。 printf_s
目前不支援輸出至 UNICODE 資料流。
這些有 _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
引數是由一般字元、逸出序列和格式規格 (如果引數接在 format
之後) 所組成。 一般字元和逸出序列會依其出現的順序複製到 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.35000000000000008) 會繼續四捨五入至 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
另請參閱
數學與浮點支援
資料流 I/O
地區設定
fopen
, _wfopen
fprintf
、 、 _fprintf_l
、 fwprintf
_fwprintf_l
scanf
、 、 _scanf_l
、 wscanf
_wscanf_l
sprintf
、、 _sprintf_l
、 swprintf
、 _swprintf_l
、 __swprintf_l
vprintf
函數