C語言sprintf()函數(shù):將格式化的數(shù)據(jù)寫入字符串
頭文件:#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)系工作人員刪除。