c語言printf大家族系列

2021-10-05 22:41:38 字數 3422 閱讀 4422

這個最常用,作用是在螢幕上列印格式化的字串

int printf (

const

char

*__format,..

.)

第乙個引數是字串,第二個引數是…,是不定引數,返回值是格式化後的字串長度,其中\n\t這種轉義符算乙個,中文算兩個長度

#include

intmain

(void

)

這個用來格式化字串的,格式化好的字串返回給第乙個指標

int sprintf (

char

*__stream,

const

char

*__format,..

.)

第乙個引數是返回字串的指標,第二個引數是格式化的,第三個是用來格式化的不定引數,返回值是字串長度

#include

intmain

(void);

// 給予過量的空間來存放字串

int num =10;

num =

sprintf

(a,"num的大小: %d"

, num)

;// 如果是字串直接可以把頭指標放在第一引數就行

printf

("上個printf長度是:%d\n格式化好的字串是:%s"

,num,a)

;return0;

}

這個用來格式化字串輸出到乙個檔案

int fprintf (file *__stream,

const

char

*__format,..

.)

第乙個引數是返回檔案的指標,第二個引數是格式化的,第三個是用來格式化的不定引數,返回值是格式化好的字串的長度

#include

intmain()

這個也是用來格式化字串的,對比sprintf只是多了乙個長度引數,用起來比較安全

int snprintf (

char

*__buf, size_t __len,

const

char

*__format,..

.)

第乙個引數是返回字串的指標,第二個是長度,第三個引數是格式化的,第四個是用來格式化的不定引數,返回值是字串長度

#include

intmain()

;char name2[6]

=;int size1 =

sprintf

(name1,

"%s"

,"arthur");

printf

("name1:%s, size1:%d\n"

, name1, size1)

;// 結果:name1:arthur, size1:6

int size2 =

snprintf

(name2,

sizeof

(name2)

/sizeof

(char),

"%s"

,"arthur");

printf

("name2:%s, size2:%d\n"

, name2, size2)

;// 結果:name2:arthu, size2:6

return0;

}

為什麼說安全,這裡就要說道說道,理論上很多的大學生或者大學老師在教課的時候很容易產生乙個誤區。就是很多的人認為設定乙個字元陣列去存放「arthur」應該設定成num[6],實際上這是個錯誤的想法。眾所周知字串的末尾一般會有個『\0』作為結尾,當你本來設定好的6個陣列存實際上存放了七個,所以在連續的記憶體後還有記憶體被修改了,如果你哪個位置剛好是別的地方的引數,那麼整個程式就會一次走向無法控制的結果。所以當我們要存乙個字串的時候一定要準備乙個比字串長度大乙個的陣列去存它,才不會導致越界。

上面的例子就很好的闡述了為什麼snprintf比sprintf安全。

這個系列的函式一般是為不定引數函式服務的引數,可能實用性不是特別的強但是作為都帶printf的有必要拿出來說道說道

int

vprintf

(const

char

*format, va_list arg)

這個系列函式在用的時候都要帶上#include 這個庫檔案,這個庫檔案裡定義了va_list結構體,

還有一系列的巨集定義函式等

#include

#include

void

writefrmtd

(char

*format,..

.)int main (

)

和sprintf對比來看同樣也就是最後乙個引數的區別

int

vsprintf

(char

*str,

const

char

*format, va_list arg)

#include

#include

char buffer[80]

;int

vspfunc

(char

*format,..

.)intmain()

int

vfprintf

(file *stream,

const

char

*format, va_list arg)

#include

#include

void

writefrmtd

(file *stream,

char

*format,..

.)int main (

)

int

vsnprintf

(char

*str, size_t size,

const

char

*format, va_list ap)

;

#include

#include

#define maxlen 10

intmon_log

(char

* format,..

.)printf

("\n");

return i;

}void

main()

集合大家族

今天看到了一張集合的圖,想著有空了進行整理整理,前面高能,哈哈哈哈 看圖 我們可以看到在集合 容器 的左右都有介面,而右邊的偏多,這張圖總結了各個介面的優缺點以及面試中會遇到的問題。右邊 iterable iterable是iterator 迭代器 的父類,實現了iterable介面的類都可以擁有增...

offset三大家族

offset家族 1.1 三大家族和乙個事件物件 三大家族 offset scroll client 事件物件 event 事件被觸動時,滑鼠和鍵盤的狀態 通過屬性控制 1.2 offset家族簡介 offset這個單詞本身是 偏移,補償,位移的意思。js中有一套方便的獲取元素尺寸的辦法就是offs...

糰子最大家族(clannad)

bx2k有許多五顏六色的萌萌噠糰子。每個糰子有一種顏色。他決定將m個糰子排成一排。為了美觀,他要求任何相鄰的兩個糰子不能有相同的顏色。因為bx2k很懶,因此他來尋求你的幫助。輸入檔案包含兩行。第一行為乙個整數n,表示共有n種顏色的糰子。第二行為n個空格隔開的整數ai,表示顏色為i的糰子有ai個。題目...