不要小瞧了sprintf函式

2021-07-25 19:35:20 字數 2783 閱讀 3067

sprintf()函式:

標頭檔案:

#include

原型: int sprintf(char *buffer, const char *format, [ argument] … );

功能:字串格式化命令,主要功能是把格式化的資料寫入某個字串中。

(sprintf 是個變參函式。)

引數:

buffer:char型指標

,指向將要寫入的字串的緩衝區。

format

:格式化字串。

[argument]...

:可選引數,可以是任何型別的資料。

返回值:返回寫入buffer 的字元數,結束字元『\0』不計入內,出錯則返回-1. 如果 buffer 或 format 是空指標,且不出錯而繼續,函式將返回-1,並且 errno 會被設定為einval。如,如果「hello」被寫入空間足夠大的buffer後,函式sprintf 返回5。

說明:sprintf的第乙個引數應該是目的字串,如果不指定這個引數,執行過程中出現 "該程式產生非法操作,即將被關閉...."的提示。除了前兩個引數型別固定外,後面可以接任意多個引數。而它的精華,顯然就在第二個引數--格式化字串--上。printf()和sprintf()都使用格式化字串來指定串的格式,在格式串內部使用一些以「%」開頭的格式說明符(format specifications)來佔據乙個位置,在後邊的變參列表中提供相應的變數,最終函式就會用相應位置的變數來替代那個說明符,產生乙個呼叫者想要的字串。

sprintf()

最常見的應用之一莫過於把整數列印到字串中,如:

sprintf(s, "%d", 123);  //

把整數123列印成乙個字串儲存在s中

sprintf(s, "%8x", 4567);  //

小寫16進製制,寬度佔8個位置,右對齊

補充:sprintf和printf

sprintf的作用是將乙個格式化的字串輸出到乙個目的字串中,而printf是將乙個格式化的字串輸出到螢幕。

sprintf()

會根據引數format字串來轉換並格式化資料,然後將結果複製到引數str 所指的字串陣列,直到出現字串結束('\0')為止。

注意:c語言對陣列進行操作時並不檢測陣列的長度,如果str的長度不夠,sprintf()很容易造成緩衝區溢位,帶來意想不到的後果,黑客經常利用這個弱點攻擊看上去安全的系統。

eg1:

#include main()

編譯並執行,螢幕上輸出」the length of the string is more than 10「,同時系統提示程式已經停止。原因就是要寫入的字串的長度超過了buf的長度,造成緩衝區溢位。

補充:使用sprintf 對於寫入buffer的字元數是沒有限制的,這就存在了可能buffer溢位。解決這個問題,可以考慮使用snprintf函式,該函式可對寫入字元數做出限制。

eg2:列印字母a的ascii值

#include main()

執行結果:

the ascii code of a is 97.

eg3:產生10個100以內的隨機數並輸出

#include#include#includeint main(void)

str[offset-1]='\n';

printf(str);

return 0;

}

執行結果:

74,43,95,95,44,90,70,23,66,84

補充:例子使用了乙個新函式srand(),它能產生隨機數。例子中最複雜的部分是for迴圈中每次呼叫函式sprintf()往字元陣列寫資料的時候,str+foffset為每次寫入資料的開始位址,最終的結果是所有產生的隨機資料都被以整數的形式存入陣列中。

sprintf函式的其他功能:

可以指定寬度,不足的左邊補空格:

sprintf(s,"%4d%4d", 123, 4567); //

產生:"1234567"

當然也可以左對齊:

sprintf(s,"%-4d%4d", 123, 4567); //

產生:"1234567"

也可以按照

16 進製列印:

sprintf(s,"%8x", 4567); //

小寫16

進製,寬度佔

8 個位置,

右對齊sprintf(s,"%-8x", 4568); //

大寫16

進製,寬度佔

8 個位置,左對齊

浮點數的列印和格式控制是

sprintf

的又一大常用功能,浮點數使用格式符

」%f」

控制,預設保留小數點後

6 位數 字,比如:

sprintf(s,"%f", 3.1415926); //

產生"3.141593"

但有時我們希望自己控制列印的寬度和小數字數,這時就應該使用:

」%m.nf」

格式,其中

m 表示列印的寬度,

n 表示小數點後的位數。比如:

sprintf(s,"%10.3f", 3.1415626); //

產生:"3.142"

sprintf(s,"%-10.3f", 3.1415626); //

產生:"3.142"

sprintf(s,"%.3f", 3.1415626); //

不指定總寬度,產生:

"3.142"

可不能小瞧了 const

有的時候我們需要在程式中使用這麼一種一種變數,希望他們的值在定義了之後就不會在改變了,於是就有了 const 這個修飾符,也正因為用 const 修飾的變數的值不可以被修改,所以在定義的時候就要求必須給予初值。當乙個指標或引用和 const 結合時會發生很多美妙的事情,嘿嘿。我們知道指標是乙個物件,...

fgets函式 sprintf函式

char fgets char restrict s,int n,file restrict stream 第乙個引數為資料存放的陣列,第二個引數為最大長度,第三個引數為輸入源,我們從鍵盤讀入,引數為stdin 可以看到fgets 讀取的字串長度包含了結尾的 0 遍歷陣列時要注意下標越界。strle...

sprintf函式詳解

printf 可能是許多程式設計師在開始學習c 語言時接觸到的第二個函式 我猜第乙個是main 說 起來,自然是老朋友了,可是,你對這個老朋友了解多嗎?你對它的那個孿生兄弟sprintf 了解多 嗎?在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟pr...