有没有人知道将printf样式函数的输出重定向到字符串的安全方法?显而易见的方法导致缓冲区溢出.
就像是:
string s; output.beginRedirect( s ); // redirect output to s ... output.print( "%s%d", foo, bar ); output.endRedirect();
我认为问题与询问一样,"会产生多少个字符?" 想法?
您可以使用:
std::snprintf
如果你正在使用char*
std::stringstream
如果你想使用字符串(与printf不同,但允许你使用普通的流函数轻松操作字符串).
boost::format
如果你想要一个类似于printf的函数,它将与stream一起使用.(根据评论中的jalf)
fmt::format
这是标准化的,很可能成为 std::format
该snprintf()
函数打印到一个字符串,但只有给它的长度.
可能就是你要找的......
fmt库提供fmt::sprintf
执行printf兼容格式化的功能(包括根据POSIX规范的位置参数),并将结果返回为std::string
:
std::string s = fmt::sprintf( "%s%d", foo, bar );
免责声明:我是这个图书馆的作者.
既然你已经将它标记为C++(而不仅仅是C),我会指出在C++中执行此类操作的典型方法是使用stringstream,而不是printf系列.无需担心stringstreams的缓冲区溢出.
该升压格式库也可以,如果你喜欢的printf风格的格式字符串,但想要的东西更安全.