sprintf函數、snprintf函數、asprintf函數、vsprintf


sprintf函數:

功能

把格式化的數據寫入某個 字符串 緩沖區

頭文件

原型

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

參數列表

bufferchar型指針,指向將要寫入的字符串的緩沖區。
format:格式化字符串。
[argument].. .:可選參數,可以是任何類型的數據。
返回值:字符串長度( strlen
 
 

snprintf函數:

數原型:
int snprintf(char *str, size_t size, const char *format, ...);

 
size 的作用就是限制往str寫入不超過size個字節(包括了結尾的'/0')。
因為sprintf()函數如果成功的話,返回成功寫入的字節數(字符數),我就一直以為snprintf()函數也是如此,也就是snprintf()函數不會返回大於size的整數。
……如果輸出因為size的限制而被截斷,返回值將是“如果有足夠空間存儲,所   能輸出的字符數(不包括字符串結尾的'/0')”,這個值和size相等或者比size大!也就是說,如果可以寫入的字符串是 "0123456789ABCDEF" 共16位,但是size限制了是10,這樣 snprintf() 的返回值將會是 16 而不是 10 !
 
上面的內容還說,如果返回值等於或者大於size,則表明輸出字符串被截斷了(truncated)。
 
 
asprintf函數
函數原型:
int asprintf(char ** strp , const char * fmt , ...);
功能:
asprintf()可以說是一個增強版的sprintf(),在不確定字符串的長度時,非常靈活方便,能夠根據格式化的字符串長度,申請足夠的內存空間。此外,使用完后,必須通過free()釋放空間。不過,這是GNU擴展的C函數庫,不是標准C函數庫或者POSIX。
頭文件:asprintf.h
vtid的common.h中例子:
template<typename T>
string String(const T& t, const string& fmt)
{
    char* buf;
    if (asprintf(&buf, fmt.c_str(), t) < 0) {
        fprintf(stderr, "asprintf(%s) : %s\n", fmt.c_str(), strerror(errno));
        return "";
    }
    string str(buf);
    free(buf);
    return str;
}

 

 
vsprintf函數

vsprintf()函數中的自變量是位於數組中的,數組元素的字符串之前都要加上百分號(%)。這個函數是“一步一步[step-by-step]”按順序執行。在第一個%后,將插入第一個數組元素;在第二個%后,將插入第二個數組元素,依次類推。

vsprintf是sprintf的一個變形,它只有三個參數。vsprintf用於執行有多個參數的自訂函式,類似printf格式。vsprintf的前兩個參數與sprintf相同:一個用於保存結果的字元緩沖區和一個格式字串。第三個參數是指向格式化參數陣列的指標。實際上,該指標指向在堆疊中供函式呼叫的變數。va_list、va_start和va_end巨集(在STDARG.H中定義)幫助我們處理堆疊指標。本章最后的SCRNSIZE程式展示了使用這些巨集的方法。使用vsprintf函式,sprintf函式可以這樣編寫:

int sprintf (char * szBuffer, const char * szFormat, ...){ int iReturn ; va_list pArgs ; va_start (pArgs, szFormat) ; iReturn = vsprintf (szBuffer, szFormat, pArgs) ; va_end (pArgs) ; return iReturn ;}

va_start巨集將pArg設置為指向一個堆疊變數,該變數位址在堆疊參數szFormat的上面。

函數名: vsprintf

功 能: 送格式化輸出到串中

用 法: int vsprintf(char *string, char *format, va_list param);

vsprintf(buffer, fmt, argptr);

fmt="%d %f %s"

就是把后面的參數按照 "%d %f %s" 這個格式輸出到 buffer 中。

 

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM