轉自:https://zh.cppreference.com/w/c/io/fprintf
定義於頭文件 |
||
(1) | ||
int printf( const char *format, ... ); |
(C99 前) | |
int printf( const char *restrict format, ... ); |
(C99 起) | |
(2) | ||
int fprintf( FILE *stream, const char *format, ... ); |
(C99 前) | |
int fprintf( FILE *restrict stream, const char *restrict format, ... ); |
(C99 起) | |
(3) | ||
int sprintf( char *buffer, const char *format, ... ); |
(C99 前) | |
int sprintf( char *restrict buffer, const char *restrict format, ... ); |
(C99 起) | |
int snprintf( char *restrict buffer, int bufsz, |
(4) | (C99 起) |
int printf_s(const char *restrict format, ...); |
(5) | (C11 起) |
int fprintf_s(FILE *restrict stream, const char *restrict format, ...); |
(6) | (C11 起) |
int sprintf_s(char *restrict buffer, rsize_t bufsz, |
(7) | (C11 起) |
int snprintf_s(char *restrict buffer, rsize_t bufsz, |
(8) | (C11 起) |
從給定位置加載數據,轉換爲字符串等價物,並寫結果到各種池。
1) 寫結果到 stdout 。
2) 寫結果到文件流 stream
。
3) 寫結果到字符串 buffer
。
4) 寫結果到字符串 buffer
。至多寫 buf_size
- 1 個字符。產生的字符串會以空字符終止,除非 buf_size
爲零。若 buf_size
爲零,則不寫入任何內容,且 buffer
可以是空指針,然而依舊計算返回值(會寫入的字符數,不包含空終止符)並返回。
5-8) 同 (1-4) ,除了在運行時檢測下列錯誤,並調用當前安裝的制約處理函數:
format
中存在轉換指定符%n
- 任何一個對應
%s
的參數是空指針 format
或buffer
是空指針bufsz
爲零或大於 RSIZE_MAX- 在任何一個字符串及字符轉換指定符中出現編碼錯誤
- (僅對於
sprintf_s
)存儲於buffer
的字符串(包括尾隨空字符)長度將超出bufsz
同所有邊界檢查函數, printf_s, fprintf_s, sprintf_s, snrintf_s
僅若實現定義了 __STDC_LIB_EXT1__ ,且用戶在包含 <stdio.h>
前定義 __STDC_WANT_LIB_EXT1__ 爲整數常量 1 才保證可用。
參數
stream | - | 要寫入的輸出文件流 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 指向要寫入的字符串的指針 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bufsz | - | 最多會寫入 bufsz - 1 個字符,再加空終止符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 指向指定數據轉譯方式的空終止多字節字符串的指針。
格式字符串由普通多字節字符(除了
下列格式指定符可用:
浮點轉換函數轉換無窮大到 非數轉換成 轉換 儘管 定寬整數類型( int8_t 等)的正確轉換指定定義於頭文件 <inttypes.h> (儘管 PRIdMAX 、 PRIuMAX 等就是 內存寫入轉換指定符 %n 是安全漏洞的常見目標,這裏格式字符串依賴用戶輸入,而此轉換指定符不爲邊界檢查的 在每個轉換指定符的行動後有一個序列點;這允許存入多次 %n 的結果於同一變量,並在同一調用中打印出先前以 %n 存儲的值。 若轉換指定非法,則行爲未定義。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 指定要打印數據的參數。若任何默認參數提升後的參數不擁有對應轉換指定符所期待的類型,或若參數數量少於 format 的要求,則行爲未定義。若有多於 format 要求的參數,則求值並忽略多出的參數。 |
返回值
1,2) 傳輸到輸出流的字符數,或若出現輸出錯誤或編碼錯誤(對於字符串和字符轉換指定符)則爲負值。
3) 寫入到 buffer
的字符數(不計空終止字符),或若輸出錯誤或編碼錯誤(對於字符串和字符轉換指定符)發生則爲負值。
4) 假如忽略 bufsz
則本應寫入到 buffer
的字符數(不計空終止字符),或若出現輸出錯誤或編碼錯誤(對於字符串和字符轉換指定符)則爲負值。
5,6) 傳輸到輸出流的字符數,或若出現輸出錯誤、運行時制約違規錯誤或編碼錯誤則爲負值。
7) 寫入到buffer
的字符數,不計空終止字符(只要 buffer
不是空指針且 bufsz
非零且不大於 RSIZE_MAX
,就寫入它),在運行時制約違規時爲零,而在編碼錯誤時爲負值。
8) 假如忽略 bufsz
則本應寫入 buffer
的字符數的,不包含空終止字符(只要 buffer
不是空指針而 bufsz
非零且不大於 RSIZE_MAX
,就寫入它),或若出現輸出錯誤、運行時制約違規錯誤或編碼錯誤則爲負值。
注意
C 標準及POSIX 指定 sprintf
及其變體的行爲在參數與目標緩衝區重疊時未定義。示例:
sprintf(dst, "%s and %s", dst, t); // <- 有錯:未定義行爲
POSIX指定在錯誤時設置errno。它亦指定附加的轉換指定,最值得注意的是對參數重排序的支持(緊隨%之後的n$指示第n
個參數)。
以零爲 bufsz
和空指針爲 buffer
調用 snprintf
可用於決定包含輸出的緩衝區大小:
const char *fmt = "sqrt(2) = %f"; int sz = snprintf(NULL, 0, fmt, sqrt(2)); char buf[sz + 1]; // 注意爲終止空字符 +1 snprintf(buf, sizeof buf, fmt, sqrt(2));
同 snprintf
,但不同於 sprintf_s
, snprintf_s
會將輸出截斷在 bufsz-1
之內。
示例
運行此代碼
#include <stdio.h> int main(void) { printf("Strings:\n"); const char* s = "Hello"; printf("\t.%10s.\n\t.%-10s.\n\t.%*s.\n", s, s, 10, s); printf("Characters:\t%c %%\n", 65); printf("Integers\n"); printf("Decimal:\t%i %d %.6i %i %.0i %+i %u\n", 1, 2, 3, 0, 0, 4, -1); printf("Hexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6); printf("Octal:\t%o %#o %#o\n", 10, 10, 4); printf("Floating point\n"); printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); printf("Padding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); printf("Scientific:\t%E %e\n", 1.5, 1.5); printf("Hexadecimal:\t%a %A\n", 1.5, 1.5); }
輸出:
Strings: . Hello. .Hello . . Hello. Characters: A % Integers Decimal: 1 2 000003 0 +4 4294967295 Hexadecimal: 5 a A 0x6 Octal: 12 012 04 Floating point Rounding: 1.500000 2 1.30000000000000004440892098500626 Padding: 01.50 1.50 1.50 Scientific: 1.500000E+00 1.500000e+00 Hexadecimal: 0x1.8p+0 0X1.8P+0
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.21.6.1 The fprintf function (p: 309-316)
- 7.21.6.3 The printf function (p: 324)
- 7.21.6.5 The snprintf function (p: 325)
- 7.21.6.6 The sprintf function (p: 325-326)
- K.3.5.3.1 The fprintf_s function (p: 591)
- K.3.5.3.3 The printf_s function (p: 593-594)
- K.3.5.3.5 The snprintf_s function (p: 594-595)
- K.3.5.3.6 The sprintf_s function (p: 595-596)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.6.1 The fprintf function (p: 274-282)
- 7.19.6.3 The printf function (p: 290)
- 7.19.6.5 The snprintf function (p: 290-291)
- 7.19.6.6 The sprintf function (p: 291)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.9.6.1 The fprintf function
- 4.9.6.3 The printf function
- 4.9.6.5 The sprintf function
參閱
wprintf (C95) |
打印格式化寬字符輸出到stdout、文件流或緩衝區 (函數) |
vprintf
|
打印格式化輸出到stdout、文件流或緩衝區 使用可變參數列表 (函數) |
將一個字符串寫入文件流 (函數) |
|
scanf
|
從stdin、文件流或緩衝區讀取格式化輸入 (函數) |
printf, fprintf, sprintf, snprintf 的 C++ 文檔 |