sprintf_s如何避免缓冲区溢出问题
Visual Studio 提示我sprintf用sprintf_s, 而不是snprintf.
sprintf_s 不需要长度参数,它如何避免缓冲区溢出问题?
回答
有2个版本。一种模板版本试图推断缓冲区的大小,另一种是传递大小的模板版本。
int sprintf_s<_Size>(char (&_Dest)[_Size], const char *_Format, ...)
int sprintf_s(char * _DestBuf, size_t _SizeInBytes, const char *_Format, ...)
如果不能推导出第一个,则必须自己传递大小
所以这:
char buf[100];
sprintf_s(buf, "%d", 1);
将实例化一个函数模板
sprintf_s<100>();
这将产生一个编译器错误:
char *buf = new char[100];
sprintf_s(buf, "%", 1);
你必须使用另一个版本来编译它:
sprintf_s(buf, 100, "%d", 1);