的String.Format替代在C ++ [重复](String.Format alternati

2019-06-24 03:21发布

这个问题已经在这里有一个答案:

  • 的std :: string格式化一样的sprintf 38个回答

我没有与C ++的工作太多经验。 而是我已经在C#中的工作更多,所以,我想请通过与我会在那里做了我的问题。 我不得不生成字符串,我要传递给另一个功能的特定的格式。 在C#,我会容易产生通过以下简单的代码串。

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

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

通过产生这样一个上面的字符串,我应该能够通过这在system() 但是, system只接受char*

我对Win32 C++ (不是C ++ / CLI),而不能使用boost ,因为它会包含太多的项目,这本身是非常小的夹杂物的所有文件。 喜欢的东西sprintf()看起来对我来说非常有用,但sprintf不接受string作为abc参数。 任何建议,我怎么能产生这些格式的字符串传递给系统在我的计划?

Answer 1:

您可以使用sprintf结合std::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() );


Answer 2:

C ++的方法是使用std::stringstream对象为:

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

与c的方法是使用sprintf

与c的方法是困难的,因为得到的权利:

  • 它的类型是不安全
  • 需要缓冲管理

当然,你可能要回落在C方式,如果性能是一个问题(想象你正在创建固定大小的小百万stringstream对象,然后扔掉)。



Answer 3:

为了完整起见,你可以使用std::stringstream

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string a = "a", b = "b", c = "c";
    // apply formatting
    std::stringstream s;
    s << a << " " << b << " > " << c;
    // assign to std::string
    std::string str = s.str();
    std::cout << str << "\n";
}

或者(在这种情况下) 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";
}

以供参考:

  • http://en.cppreference.com/w/cpp/string/basic_string/operator+

如果你真的想要去的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 memory management (to avoid memory leaks)
    std::vector<char>::size_type size = 256;
    std::vector<char> buf;
    do {
        // use snprintf instead of sprintf (to avoid buffer overflows)
        // snprintf returns the required size (without terminating null)
        // if buffer is too small initially: loop should run at most twice
        buf.resize(size+1);
        size = std::snprintf(
                &buf[0], buf.size(),
                fmt, a.c_str(), b.c_str(), c.c_str());
    } while (size+1 > buf.size());
    // assign to std::string
    std::string str = &buf[0];
    std::cout << str << "\n";
}

以供参考:

  • http://en.cppreference.com/w/cpp/io/c/fprintf

然后,还有的升压格式库 。 为了您的例子的缘故:

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


Answer 4:

除了由别人建议的选项,我可以推荐的FMT库 ,它实现字符串格式化类似str.format在Python和String.Format在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);

免责声明:我这个库的作者。



Answer 5:

为了完整起见,升压的方法是使用boost::format

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

随你挑。 升压解决方案具有与类型安全的优势sprintf格式(对于那些谁找到<<语法有点笨重)。



Answer 6:

您只需在连接字符串,并建立一个命令行。

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

你并不需要为这个任何额外的库。



Answer 7:

前面已经提到过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();


文章来源: String.Format alternative in C++ [duplicate]