2012-07-20 69 views

回答

18

_開頭的全局名稱空間中的標識符被保留用於實現。 _snprintf只是實現(Visual Studio)提供的一個函數。至於其基本原理,Visual Studio實現了C89,而snprintf是後來的C99標準的一部分。

除此之外,兩種功能的語義是在返回類型,它在snprintf始終是格式化的字符串採用(是否有在緩衝足夠的空間或沒有,而_snprintf將返回字符數不同。負數如果沒有在緩衝區足夠的空間

也就是說,分配緩衝區只是足夠大的輸出,你可以這樣做:

int size = snprintf(0, 0, "%s %d\n", str, i); 
char * buffer = malloc(size+1); 
snprintf(buffer, size+1, "%s %d\n", str, i); 

你不能做到這一點與_snprintf爲上函數返回的信息是當前大小不夠。

11

snprintf()還沒有成爲微軟C運行時開始支持它的標準的一部分。

由於函數原型沒有標準化,並且開發人員不想使用名稱snprintf(以防標準稍後指定了不同的原型),所以他們選擇添加一個前導下劃線來表示該函數爲Microsoft擴展到標準。

3

添加到上面,

有適當的C99 snprintf()vsnprintf()可用,因爲的Visual Studio 2015年

,他們甚至不觸發衆所周知的不安全功能棄用警告。
_snprintf_s()_vsnprintf_s(),而提供,是的MSVC專用功能「安全變體」,與非C99行爲。

0

除了在緩衝區不夠大的情況下的不同返回值(在David的回答中描述)之外,來自_sn...組的功能與標準snprintf在另一個重要方面有所不同。如果目標緩衝區是一個字符太短,該_sn...功能考慮這種情況下「成功」。

更詳細地,如果目標緩衝器是足夠長,以在整個得到的序列存儲但沒有終止零字符,所述_sn...函數不截斷的結果,不寫終止零到目標緩衝器和作爲結果返回緩衝區的大小。所以,通常情況下,結果不能保證以零終止。

在相同的情況下,snprintf將丟棄所產生的序列的最後一個字符和寫在其位0終結。 snprintf的結果始終爲零終止。

相關問題