博客專欄

EEPW首頁 > 博客 > C語言sprintf()函數(shù):將格式化的數(shù)據(jù)寫入字符串

C語言sprintf()函數(shù):將格式化的數(shù)據(jù)寫入字符串

發(fā)布人:電子禪石 時間:2019-12-24 來源:工程師 發(fā)布文章

頭文件:#include <stdio.h>

sprintf()函數(shù)用于將格式化的數(shù)據(jù)寫入字符串,其原型為:
    int sprintf(char *str, char * format [, argument, ...]);

【參數(shù)】str為要寫入的字符串;format為格式化字符串,與printf()函數(shù)相同;argument為變量。

除了前兩個參數(shù)類型固定外,后面可以接任意多個參數(shù)。而它的精華,顯然就在第二個參數(shù)--格式化字符串--上。 printf()和sprintf()都使用格式化字符串來指定串的格式,在格式串內(nèi)部使用一些以“%”開頭的格式說明符(format specifications)來占據(jù)一個位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會用相應(yīng)位置的變量來替代那個說明符,產(chǎn)生一個調(diào)用者想要的字符串。

sprintf()最常見的應(yīng)用之一莫過于把整數(shù)打印到字符串中,如:
    sprintf(s, "%d", 123);  //把整數(shù)123打印成一個字符串保存在s中
    sprintf(s, "%8x", 4567);  //小寫16進(jìn)制,寬度占8個位置,右對齊

sprintf的作用是將一個格式化的字符串輸出到一個目的字符串中,而printf是將一個格式化的字符串輸出到屏幕。sprintf的第一個參數(shù)應(yīng)該是目的字符串,如果不指定這個參數(shù),執(zhí)行過程中出現(xiàn) "該程序產(chǎn)生非法操作,即將被關(guān)閉...."的提示。

sprintf()會根據(jù)參數(shù)format 字符串來轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果復(fù)制到參數(shù)str 所指的字符串?dāng)?shù)組,直到出現(xiàn)字符串結(jié)束('\0')為止。關(guān)于參數(shù)format 字符串的格式請參考printf()。

【返回值】成功則返回參數(shù)str 字符串長度,失敗則返回-1,錯誤原因存于errno 中。

注意:C語言對數(shù)組進(jìn)行操作時并不檢測數(shù)組的長度,如果str的長度不夠,sprintf()很容易造成緩沖區(qū)溢出,帶來意想不到的后果,黑客經(jīng)常利用這個弱點(diǎn)攻擊看上去安全的系統(tǒng)。請看下面的代碼:

#include <stdio.h>
main()
{char buf[10];
sprintf(buf, "The length of the string is more than 10");
printf("%s", buf);}

編譯并運(yùn)行,屏幕上輸出”The length of the string is more than 10“,同時系統(tǒng)提示程序已經(jīng)停止。原因就是要寫入的字符串的長度超過了buf的長度,造成緩沖區(qū)溢出。

使用snprintf()來代替sprintf()將能夠很好的解決這個問題。

【實(shí)例】打印字母a的ASCII值。

#include <stdio.h>
main()
{char a = 'a';
char buf[80];
sprintf(buf, "The ASCII code of a is %d.", a);
printf("%s", buf);}

運(yùn)行結(jié)果:
The ASCII code of a is 97.

又如,產(chǎn)生10個100以內(nèi)的隨機(jī)數(shù)并輸出。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{char str[100];
int offset =0;
int i=0;
srand(time(0));  // *隨機(jī)種子
for(i = 0;i<10;i++)
{offset+=sprintf(str+offset,"%d,",rand()%100);  // 格式化的數(shù)據(jù)寫入字符串
}
str[offset-1]='\n';
printf(str);return 0;}

運(yùn)行結(jié)果:
74,43,95,95,44,90,70,23,66,84

例子使用了一個新函數(shù)srand(),它能產(chǎn)生隨機(jī)數(shù)。例子中最復(fù)雜的部分是for循環(huán)中每次調(diào)用函數(shù)sprintf()往字符數(shù)組寫數(shù)據(jù)的時候,str+foffset為每次寫入數(shù)據(jù)的開始地址,最終的結(jié)果是所有產(chǎn)生的隨機(jī)數(shù)據(jù)都被以整數(shù)的形式存入數(shù)組中。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉