sprintf_s如何避免缓冲区溢出问题

Visual Studio 提示我sprintfsprintf_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);


以上是sprintf_s如何避免缓冲区溢出问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>