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...