others - 在 C++ 中,String.Format的替代

在C#中,我很容易通过下面的简单代码生成字符串。


string a ="test";
string b ="text.txt";
string c ="text1.txt";

String.Format("{0} {1} > {2}", a, b, c);

时间:

你可以将sprintfstd::string.c_str()结合使用。

c_str()返回一个const char*并使用sprintf


string a ="test";
string b ="text.txt";
string c ="text1.txt";
char* x = new char[a.length() + b.length() + c.length() + 32];

sprintf(x,"%s %s > %s", a.c_str(), b.c_str(), c.c_str() );

string str = x;
delete[] x;

或者,如果你知道大小,则可以使用预先分配的char数组:


string a ="test";
string b ="text.txt";
string c ="text1.txt";
char x[256];

sprintf(x,"%s %s > %s", a.c_str(), b.c_str(), c.c_str() );

C++方法将使用std::stringstream对象作为:


std::stringstream fmt;
fmt << a <<"" << b <<" >" << c;

C的方法是使用sprintf

C的方法不太正确,因为:

  • 类型不安全
  • 需要缓冲区管理

如果Boost不是选项,你可以选择串流方式,或者(在这种情况下)std::string的字符串串联功能:


#include <iostream>
#include <string>

int main() {
 std::string a ="a", b ="b", c ="c";
 std::string str = a +"" + b +" >" + c;
 std::cout << str <<"n";
}


如果你真的想采用C的路数 ,就是这样:


#include <iostream>
#include <string>
#include <vector>
#include <cstdio>

int main() {
 std::string a ="a", b ="b", c ="c";
 const char fmt[] ="%s %s > %s";
 // use std::vector for your memory management (to avoid memory leaks)
 std::vector<char> buf;
 buf.resize(a.length()+b.length()+c.length()+sizeof(fmt));
 // use snprintf instead of sprintf (to avoid buffer overflows)
 std::snprintf(&buf[0], buf.size(), fmt, a.c_str(), b.c_str(), c.c_str());
 // assign to std::string
 std::string str = &buf[0];
 std::cout << str <<"n";
}

但是我觉得这个比较难看。


然后是 Boost Format ,for 你的例子:


#include <iostream>
#include <string>
#include <boost/format.hpp>

int main() {
 std::string a ="a", b ="b", c ="c";
 // apply format
 boost::format fmt = boost::format("%s %s > %s") % a % b % c; 
 // assign to std::string
 std::string str = fmt.str();
 std::cout << str <<"n";
}

如前所述,C++方法使用stringstreams 。


#include <sstream>

string a ="test";
string b ="text.txt";
string c ="text1.txt";

std::stringstream ostr;
ostr << a <<"" << b <<" >" << c;

注意,你可以像这样从字符串流对象中获取C字符串。


std::string formatted_string = ostr.str();
const char* c_str = formatted_string.c_str();

你可以只连接字符串并构建一个命令行。


std::string command = a + ' ' + b +" >" + c;
system(command.c_str());

你不需要任何额外的库。

为了实现完整性,boost方法是使用boost::format


cout << boost::format("%s %s > %s") % a % b % c;

下面是一个例子:


std::string a ="test";
std::string b ="text.txt";
std::string c ="text1.txt";
std::string result = fmt::format("{0} {1} > {2}", a, b, c);

免责声明:我是此库的作者。

以下是我使用的内容:


static LPCWSTR formatString(LPCWSTR format, ...)
{
 WCHAR buffer[4096];
 va_list args;
 va_start(args, format);
 vswprintf_s(buffer, format, args);
 size_t bytes = (wcslen(buffer) + 1) * sizeof(WCHAR);
 LPWSTR result = (LPWSTR) malloc(bytes);
 memcpy(result, buffer, bytes);
 va_end(args);
 return result;
}

...