C 中sprintf s與sprintf的不同

2021-07-16 12:17:46 字數 2408 閱讀 8404

今天在程式編譯時遇到乙個warning,

:\convertmnist\convertmnist\mnist.cpp(72): warning c4996: 'sprintf': this function or variable may be unsafe. consider using sprintf_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details.

1>          d:\vs2010\vc\include\stdio.h(371) : 參見「sprintf」的宣告

所以就來看一下c++中sprintf_s與sprintf有什麼不同!

sprintf_s是乙個

函式,函式功能:將資料格式化輸出到

字串。

函式原型:

int sprintf_s(

char *buffer,

size_t sizeofbuffer,

const char *format [,

argument] ...

);sprintf_s()是sprintf()的安全版本,通過指定

緩衝區長度來避免sprintf()存在的溢位風險

相關函式:

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

int vsprintf( char *buffer, const char *format, va_list argptr );

int _sprintf_s_l(

char *buffer,

size_t sizeofbuffer,

const char *format,

locale_t locale [,

argument] ...

);int swprintf_s(

wchar_t *buffer,

size_t sizeofbuffer,

const wchar_t *format [,

argument]...

);int _swprintf_s_l(

wchar_t *buffer,

size_t sizeofbuffer,

const wchar_t *format,

locale_t locale [,

argument]…

);template

int sprintf_s(

char (&buffer)[size],

const char *format [,

argument] ...

); // c++ only

template <

size_t size>

int swprintf_s(

wchar_t (&buffer)[size],

const wchar_t *format [,

argument]...

); // c++ only

sprintf_s和sprintf的主要不同是sprintf_s對於格式化string中的格式化的字元的有效性進行了檢查,而sprintf僅僅檢查格式化string或者緩衝區是否是空指標。如果有錯誤則返回相應的錯誤**。

另乙個不同,sprintf_s也攜帶著接收格式化字串的緩衝區的大小。如果,格式化字串過大,則sprintf_s會返回乙個空string和設定無效引數控制代碼為啟用。與snprintf不同,sprintf_s不會保證緩衝區為以null結尾,除非,緩衝區的大小為0。

sprintf_s將格式化字串存到緩衝區,並在下乙個位置填充null後將格式化字串未占用的緩衝區(null之後的buffer)全部填充為-3,而sprintf卻不會填充而是保持緩衝區中未占用的儲存位置上的資料。

當然也有人表示反感,好討厭這個sprintf_s 以前學vc6的時候都是用sprintf格式化字串,用了vs2015的版本後sprintf就不可以用了,只能用sprintf_s說這安全性更高,如果是正常的char陣列格式化就沒事通過,當要將char*格式化的時候編譯就不通過,只能將char*轉換成char然後再用sprintf_s,這樣就變得好麻煩了,各位大神有木有更簡便的方法,或者函式來格式化字元指標……

解決方法:1.

你可以在建專案的時候把安全編譯去了。。

#pragma warning(disable:4996)

...

2

. 你可以定義  _crt_secure_no_warnings ,然後繼續使用 sprintf 

3.你可以用 std::stringstream

不過個人認為微軟搞這些函式加s提高安全性防止陣列越界,還是挺好的。

C與C 中的 問題

test.c include void change int a,int b,int c int main 執行 compiling.9.cd vcfile 9.c 4 error c2143 syntax error missing before d vcfile 9.c 4 error c214...

c與c 中struct區別

這裡有兩種情況下的區別。1 c的struct與c 的class的區別。2 c 中的struct和class的區別。在第一種情況下,struct與class有著非常明顯的區別。c是一種過程化的語言,struct只是作為一種複雜資料型別定義,struct中只能定義成員變數,不能定義成員函式 在純粹的c語...

c與c 中const使用

c中可以修改const修飾的變數的值 區域性變數 int main 全域性變數 const int c 10 唯讀 int main c 中不可以修改const修飾的變數的值 區域性變數 int main 為什麼 p輸出的是11?原因 區域性變數 const int c其實是儲存在符號表中,無記憶體...