安全printf到字符串的最佳方法?

use*_*956 16 c++ stl

有没有人知道将printf样式函数的输出重定向到字符串的安全方法?显而易见的方法导致缓冲区溢出.

就像是:

string s;
output.beginRedirect( s );  // redirect output to s

... output.print( "%s%d", foo, bar );

output.endRedirect();
Run Code Online (Sandbox Code Playgroud)

我认为问题与询问一样,"会产生多少个字符?" 想法?

Ada*_*eck 28

您可以使用:

std::snprintf 如果你正在使用char*

std::stringstream 如果你想使用字符串(与printf不同,但允许你使用普通的流函数轻松操作字符串).

boost::format如果你想要一个类似于printf的函数,它将与stream一起使用.(根据评论中的jalf)

fmt::format 这是标准化的,很可能成为 std::format

  • 和boost :: format使用C++流获得类似printf的格式化功能 (3认同)

aby*_*byx 11

snprintf()函数打印到一个字符串,但只有给它的长度.

可能就是你要找的......


vit*_*aut 6

fmt库提供fmt::sprintf执行printf兼容格式化的功能(包括根据POSIX规范的位置参数),并将结果返回为std::string:

std::string s = fmt::sprintf( "%s%d", foo, bar );
Run Code Online (Sandbox Code Playgroud)

免责声明:我是这个图书馆的作者.


Kri*_*son 5

既然你已经将它标记为C++(而不仅仅是C),我会指出在C++中执行此类操作的典型方法是使用stringstream,而不是printf系列.无需担心stringstreams的缓冲区溢出.

升压格式库也可以,如果你喜欢的printf风格的格式字符串,但想要的东西更安全.


gnu*_*nud 5

snprintf() 返回写入整个字符串所需的字节数。所以,举一个小例子:

#include <strings.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) 
{
    char* buf = 0;
    size_t bufsize = 0;
    size_t sz;

    const char* format="%s and %s.";
    const char* str_1 ="string 1";
    const char* str_2 ="string 2";

    sz = snprintf(buf, bufsize, format, str_1, str_2);
    printf("The buffer needs to be %d bytes.\n", sz);

    buf=malloc(sz+1);
    if(!buf) {
        printf("Can't allocate buffer!\n");
        return 1;
    }
    bufsize = sz+1;
    buf[bufsize-1] = '\0';
    sz = snprintf(buf, bufsize, format, str_1, str_2);
    printf("Filled buffer with %d bytes.\n", sz);
    printf("The buffer contains:\n'%s'\n", buf);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

The buffer needs to be 22 bytes.
Filled buffer with 22 bytes.
The buffer contains:
'string 1 and string 2.'
Run Code Online (Sandbox Code Playgroud)


Lar*_*itz 4

这个 StackOverflow 问题有类似的讨论。同样在这个问题中,我提出了我最喜欢的解决方案,一个“格式”函数,它采用与 printf 相同的参数并返回 std::string 。