c檔案輸出函式printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
轉自: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++ 文件 |