C C語言格式化輸出函式及使用禁區

2021-06-25 19:08:58 字數 2330 閱讀 4990

編譯環境:

debian: 7.6

gcc: 4.7.2

一、格式化輸出函式

c語言中設計到的標準格式化輸出函式如下:

#include int printf(const char *format, ...);

int fprintf(file *stream, const char *format, ...);

int sprintf(char *str, const char *format, ...);

int snprintf(char *str, size_t size, const char *format, ...);

#include int vprintf(const char *format, va_list ap);

int vfprintf(file *stream, const char *format, va_list ap);

int vsprintf(char *str, const char *format, va_list ap);

int vsnprintf(char *str, size_t size, const char *format, va_list ap);

二、相互之間的關係

1、共同點:

在格式化字串的控制下,把資料輸出到輸出裝置。格式化字串指定如何把後續的引數進行轉化。如:

printf("%02x", 100);    /* 輸出是16進製制 */

printf("%dx", 100); /* 輸出是10進製 */

2、不同點:

按輸出到的裝置分:

printf()

vprintf()

輸出至標準輸出流stdout

fprintf()

vfprintf()

輸出至指定輸出流

sprintf()

snprintf()

vsprintf()

vsnprintf()

輸出至字串str

按是否指定操作位元組分:

snprintf()

vsnprintf()

寫入至多size個位元組(含'\0'

)到dtr

vprintf()

vfprintf()

vsprintf()

vsnprintf()

分別等同於:printf()

fprintf()

sprintf()

snprintf()

區別是:它們都有va_list列表,一旦呼叫完畢,ap即成為「未定義」狀態

3、返回值:

正常情況下,函式返回輸出成功的字元個數(不含'\0')。若出錯,返回負值。

snprintf()和vsnprintf()輸出字元個數不超過size位元組

(含'\0'),

如果size小於字串的長度(不含'\0'),字串會被截斷,返回值是字串的長度(不含'\0'),如下:

int  len;

char str_buf[100];

len = snprintf(buf, 10, "%s$", "1234567890123");

// len: 13, buf: "1234567890"

如果size大於資料緩衝區長度,緩衝區長度個字串會被複製,返回值是字串的長度(不含'\0'),如下:

char str_buf[5];

// len: 13, buf: "12345"

三、使用注意

1、在使用sprintf()和vsprintf()的時候,應確保資料大小不超出str緩衝區的大小

,否則產生溢位,造成災難。如果無法保證,應該選用snprintf()和vsnprintf()。

2、把字串加到原字串的後面,如下:

在我用的gcc中,這種使用如期執行;但是,在有的gcc版本中,結果並不正確。所以,不要這樣做。

而且,標準中明確指出,呼叫sprintf(), snprintf(), vsprintf(),vsnprintf()函式,如果源、目標位址重疊,結果是未定義的(undefined).

3、像這樣的**printf(foo);往往會引入bug。因為如果foo中包含「%n」將引起printf()對記憶體的寫入並造成安全漏洞

。例如:

printf("%n");    // segmentation fault

c語言格式化輸出函式printf()

printf 函式的使用 printf 函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出資訊。呼叫格式為 printf 格式化字串 參量表 其中格式化字串包括兩部分內容 一部分是正常字元,這些字元將按原樣輸出 另一部分是格式化規定字元,以 開始,後跟乙個或幾個規定字元,用來確定輸出內容格式...

go語言 格式化輸出

格式 含義 乙個 字面量 b乙個二進位制整數值 基數為2 或者是乙個 高階的 用科學計數法表示的指數為2的浮點數 c字元型。可以把輸入的數字按照ascii碼相應轉換為對應的字元 d乙個十進位制數值 基數為10 e以科學記數法e表示的浮點數或者復數值 e以科學記數法e表示的浮點數或者復數值 f以標準記...

C語言格式化輸出

1.格式控制符形式 o 格式控制符 其中,中括號裡的內容是可選的,裡的內容是必須的。以下對各個標誌的含義簡要介紹 表示格式控制的起始符號,必不可少。格式控制起始位置 表示對齊標誌,表示右對齊,表示左對其,預設情況下為右對齊。對齊標誌 o 表示當實際長度沒有格式控制的長度大時,用 o 補全。補全內容 ...