C++相当于sprintf?

lit*_*tuk 70 c++ printf

我知道这std::cout是C++的等价物printf.

什么是C++等价物sprintf

Vij*_*hew 57

std::ostringstream

例:

#include <iostream>
#include <sstream> // for ostringstream
#include <string>

int main()
{
  std::string name = "nemo";
  int age = 1000;
  std::ostringstream out;  
  out << "name: " << name << ", age: " << age;
  std::cout << out.str() << '\n';
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

name: nemo, age: 1000
Run Code Online (Sandbox Code Playgroud)

  • 这甚至与`sprintf(...)`有什么相似之处呢?您不能任意格式化数据,在使用`<<`运算符将其提供到流中时,必须依赖于已知的类型. (66认同)
  • 我不认为sprintf写入stdout.我会删除上面的插入语句. (3认同)

jan*_*anm 25

使用Boost.Format.它有std::format类似语法,类型安全,printf()结果和许多其他漂亮的东西.你不会回去.

  • ...除非你担心可执行文件的大小..:P (13认同)

Ste*_*owe 17

sprintf在C++中运行得很好.

  • 我认为OP意味着STL而不是C++. (4认同)
  • sprintf要求您分配字符缓冲区.我想像"std :: string"的"append"方法,它允许我添加格式化数据,并负责在幕后分配. (3认同)

小智 7

您可以使用iomanip头文件格式化输出流.检查一下!


Eri*_*sty 6

这是C ++ sprintf的一个不错的功能。如果使用过多,流可能会变得很丑陋。

std::string string_format(const std::string &fmt, ...) {
    int n, size=100;
    std::string str;
    va_list ap;

    while (1) {
        str.resize(size);
        va_start(ap, fmt);
        int n = vsnprintf(&str[0], size, fmt.c_str(), ap);
        va_end(ap);

        if (n > -1 && n < size)
            return str;
        if (n > -1)
            size = n + 1;
        else
            size *= 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

在C ++ 11及更高版本中,保证std :: string使用以结尾的连续存储'\0',因此将其强制转换为char *using 是合法的&str[0]

  • 但是是非法的:`(char *)str.c_str()`抛弃了const`。 (9认同)