这个问题已经在这里有一个答案:
- 的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
作为a
, b
和c
参数。 任何建议,我怎么能产生这些格式的字符串传递给系统在我的计划?
您可以使用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() );
C ++的方法是使用std::stringstream
对象为:
std::stringstream fmt;
fmt << a << " " << b << " > " << c;
与c的方法是使用sprintf
。
与c的方法是困难的,因为得到的权利:
当然,你可能要回落在C方式,如果性能是一个问题(想象你正在创建固定大小的小百万stringstream
对象,然后扔掉)。
为了完整起见,你可以使用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";
}
除了由别人建议的选项,我可以推荐的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);
免责声明:我这个库的作者。
为了完整起见,升压的方法是使用boost::format
cout << boost::format("%s %s > %s") % a % b % c;
随你挑。 升压解决方案具有与类型安全的优势sprintf
格式(对于那些谁找到<<
语法有点笨重)。
您只需在连接字符串,并建立一个命令行。
std::string command = a + ' ' + b + " > " + c;
system(command.c_str());
你并不需要为这个任何额外的库。
前面已经提到过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();