// std::string的字符串格式化函数 template<typename ... Args> static std::string str_format(const std::string &format, Args ... args) { auto size_buf = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; std::unique_ptr<char[]> buf(new(std::nothrow) char[size_buf])...
主要是通过snprintf得到format string的长度。 #include <iostream> #include <memory> using namespace std; template<typename ... Args> string string_format(const string& format, Args ... args){ size_t size = 1 + snprintf(nullptr, 0, format.c_str(), args ...); // Extra space for \0...
#include <iostream> #include <string> int main() { int age = 25; std::string name = "Tom"; std::string message = std::string::format("My name is %s, and I am %d years old.", name.c_str(), age); std::cout << message << std::endl; return...
std::string str = format("c=%c", c);// c=A inti = 10; str = format("i=%d", i);// i=10 doubled = 1.5; str = format("d=%f", d);// d = 1.500000 std::string strName = ("txdy"); str = format("I am %s", strName.c_str());// I am txdy 这样,就可以很方便...
str = tmp.c_str(); return str.size(); } int main() { std::string std_str; int len = std_string_format(std_str, "hello %s!", "world"); std::cout << "std_str=" << std_str << ", len=" << len << std::endl; ...
2. 这里实现std::string自己的sprintf也是用了snprintf的特性,先计算大小,再创建空间,之后存入std::string. 3. 还使用了C的可变參数特性. std::wstring Format(const wchar_t *format,...) { va_list argptr; va_start(argptr, format); int count = _vsnwprintf(NULL,0,format,argptr); ...
首先是printf没法利用编译期计算能力,导致你需要指明每个参数的类型,会更麻烦而且效率不如format;其次是printf毕竟是C的东西,和C++的输入输出流、string等配合使用的话还是format更方便 2022-02-04 回复9 吴咏炜 最基本的不用printf的理由是没法定制它,让它输出一个MyObj或容器。 2022-07-20 回复...
2. 这里实现std::string自己的sprintf也是用了snprintf的特性,先计算大小,再创建空间,之后存入std::string. 3. 还使用了C的可变參数特性. std::wstringFormat(constwchar_t*format,...){va_list argptr;va_start(argptr,format);intcount=_vsnwprintf(NULL,0,format,argptr);va_end(argptr);va_start(arg...
另外:通常,格式参数是 char[] / wchar_t[] & 创建 std::string 对象效率不高。传递 char* 或 wchar_t* & 如果你已经有一个 std::string 对象,你仍然可以将它用作 your_string.c_str()。例子: int main() { int i{ 0 }; // The format parameter is a char[] / wchar_t[]: ...
std::format 在C++20之前,C++ 的格式化字符串相关设施一直饱受诟病。具体来说,在不依赖第三方库的情况下,有两种方式实现格式化字符串: 使用从 C 语言沿袭过来的sprintf以及相关函数; 使用C++ 的std::stringstream以及流相关设施。 然而,这两种方式都有明显的缺点。