_sntprintf_s 和 _sntprintf 区别

时间:2021-08-26 03:33:35

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l?view=vs-2017

int _snprintf_s( char *buffer, size_t sizeOfBuffer, size_t count, const char *format [, argument] ... );

_sntprintf是snprintf的ANSI和UNICODE通用定义,

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

功能:将可变个参数(...)按照format格式化成字符串,然后将其复制到str中

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
返回值:若成功则返回欲写入的字符串长度,若出错则返回负值。

说明:strcpy() sprintf() strcat() 存在安全隐患, 其对应的安全版为:strncpy() snprintf() strncat()

snprintf_s()函数的n代表最多复制多少个字符,函数名尾部_s表示检测缓冲区溢出,微软特有的检测。

正确用法如下:

char szTable[27] = "abcdefghijklmnopqrstuvwxyz";
char szBuffer[10] = { 0 };
//将会崩溃,因为会发生缓冲区溢出
//_snprintf_s(szBuffer, sizeof(szBuffer), "%s", szTable);
//正确用法
_snprintf_s(szBuffer, sizeof(szBuffer) - 1, "%s", szTable);
---------------------