sprintf?的C++等价物

prdp8dxp  于 2022-12-24  发布在  其他
关注(0)|答案(7)|浏览(156)

我知道std::coutprintf的C等价物。
sprintf的C
等价物是什么?

ddrv8njm

ddrv8njm1#

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;
}

输出:

name: nemo, age: 1000
kcrjzv8t

kcrjzv8t2#

更新,2019年8月:
看起来C++20将有std::format。参考实现是{fmt}。如果你现在正在寻找printf()的替代品,这将成为新的"标准"方法,值得考虑。
原件:
使用Boost.Format,它有类似printf的语法,类型安全,std::string结果,还有很多其他漂亮的东西,你不会回头的。

tez616oj

tez616oj3#

sprintf在C++中运行良好。

z18hc3ub

z18hc3ub4#

这是一个很好的c++ sprintf函数,如果你用的太多,流会变得很难看。

std::string string_format(std::string fmt, ...) {
    int 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) {
            str.resize(n); // Make sure there are no trailing zero char
            return str;
        }
        if (n > -1)
            size = n + 1;
        else
            size *= 2;
    }
}

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

w8ntj3qf

w8ntj3qf5#

您可以使用iomanip头文件来格式化输出流。检查this

xfb7svmp

xfb7svmp6#

根据您对sprintf() ing的具体计划,std::to_string()可能比其他选项更有用,也更符合习惯用法:

void say(const std::string& message) {
 // ...
}

int main() {
  say(std::to_string(5));
  say("Which is to say " + std::to_string(5) + " words");
}

恕我直言,std::to_string()的主要优点是它可以很容易地进行扩展,以支持sprintf()甚至做梦也想不到的其他类型--有点像Java的Object.toString()方法。

5lhxktic

5lhxktic7#

使用stringstream可以达到同样的效果,也可以包含<cstdio>,但仍然使用snprintf。

相关问题