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

dai*_*isy 3 c++ windows visual-studio

Visual Studio 提示我sprintfsprintf_s, 而不是snprintf.

sprintf_s 不需要长度参数,它如何避免缓冲区溢出问题?

Ser*_*sen 5

有2个版本。一种模板版本试图推断缓冲区的大小,另一种是传递大小的模板版本。

int sprintf_s<_Size>(char (&_Dest)[_Size], const char *_Format, ...)
int sprintf_s(char * _DestBuf, size_t _SizeInBytes, const char *_Format, ...)
Run Code Online (Sandbox Code Playgroud)

如果不能推导出第一个,则必须自己传递大小

所以这:

char buf[100];

sprintf_s(buf, "%d", 1);
Run Code Online (Sandbox Code Playgroud)

将实例化一个函数模板

sprintf_s<100>();
Run Code Online (Sandbox Code Playgroud)

这将产生一个编译器错误:

char *buf = new char[100];

sprintf_s(buf, "%", 1);
Run Code Online (Sandbox Code Playgroud)

你必须使用另一个版本来编译它:

sprintf_s(buf, 100, "%d", 1);
Run Code Online (Sandbox Code Playgroud)