sprintf_s 與sprintf的不同只是緩沖區的大小進行了安全處理嗎?
NO!
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument] ...
);
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
微軟的技術文檔中對於他們的不同有如下描述:
One main difference between sprintf_s and sprintf is that sprintf_s checks the format string for valid formatting characters, whereas sprintf only checks if the format string or buffer are NULL pointers. If either check fails, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, the function returns -1 and sets errno to EINVAL.
The other main difference between sprintf_s and sprintf is that sprintf_s takes a length parameter specifying the size of the output buffer in characters. If the buffer is too small for the text being printed then the buffer is set to an empty string and the invalid parameter handler is invoked. Unlike snprintf,sprintf_s guarantees that the buffer will be null-terminated (unless the buffer size is zero).
說的是,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卻不會填充而是保持緩沖區中未占用的存儲位置上的數據。
如下代碼:
char State1[50]="ABCDE";
char State2[50]="ABCDE";
string strTest("Flag");
sprintf_s(State1,sizeof(State1),"%s",strTest.c_str());
sprintf(State2,"%s",strTest.c_str());
執行結果如下: