String.C++; 我没有太多的C++经验。相反,我在C#工作得更多,因此,我想通过讲述我在C#会做些什么来问我的问题。我必须生成字符串的特定格式,并将其传递给另一个函数。在C#中,我可以通过下面的简单代码轻松生成字符串 string a = "test"; string b = "text.txt"; string c = "text1.txt"; String.Format("{0} {1} > {2}", a, b, c);

String.C++; 我没有太多的C++经验。相反,我在C#工作得更多,因此,我想通过讲述我在C#会做些什么来问我的问题。我必须生成字符串的特定格式,并将其传递给另一个函数。在C#中,我可以通过下面的简单代码轻松生成字符串 string a = "test"; string b = "text.txt"; string c = "text1.txt"; String.Format("{0} {1} > {2}", a, b, c);,c#,c++,string,string-formatting,C#,C++,String,String Formatting,通过生成上述字符串,我应该能够将其传递到system()。但是,系统只接受char* 我使用的是Win32 C++(不是C++/CLI),无法使用boost,因为对于一个本身非常小的项目,它会包含太多的所有文件。类似于sprintf()的内容对我来说很有用,但是sprintf不接受string作为a、b和c参数。有没有关于如何生成这些格式化字符串以在程序中传递给系统的建议?您可以将sprintf与std::string.c_str()结合使用 c_str()返回一个const char*并与sp

通过生成上述字符串,我应该能够将其传递到
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::StrugStule对象:

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

fmt为了完整性,增强方法是使用


cout为了完整起见,您可以使用:

供参考:


如果你真的想走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.begin(), buf.begin()+size);
    std::cout << str << "\n";
}
#包括
#包括
#包括
#包括
int main(){
std::字符串a=“a”,b=“b”,c=“c”;
常量字符fmt[]=%s%s>%s;
//使用std::vector进行内存管理(以避免内存泄漏)
std::vector::size\u type size=256;
std::载体buf;
做{
//使用snprintf而不是sprintf(以避免缓冲区溢出)
//snprintf返回所需的大小(不终止null)
//若缓冲区最初太小:循环最多运行两次
buf.调整大小(大小+1);
大小=标准::snprintf(
&buf[0],buf.size(),
fmt,a.c_str(),b.c_str(),c.c_str());
}而(size+1>buf.size());
//分配给std::string
字符串str(buf.begin(),buf.begin()+大小);

STD::CUT< P>正如前面提到的,C++方式是使用StrueFields.<
#include <sstream>

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

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

您可以连接字符串并生成命令行

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

您不需要任何额外的库。

除了其他人建议的选项之外,我可以推荐实现类似于Python中的字符串格式和C#中的
string.Format
。以下是一个示例:

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

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

system(fmt)
给了我一个错误,说
stringstream
char*
system(fmt.str().c_str())之间没有合适的转换应该这样做。请注意,至少在windows上,如果调用system()即使命令及其参数正确且引用正确,也会出现错误。请注意两件事:1)
system
是实现定义的,因此如果您想保持代码的可移植性,请不要使用它。2)如其他人所述,使用
fmt.str().c_str()
以获取字符串的
char*
(C样式字符串)表示形式。{0}、{1}、{2}不应该是%s吗?我应该在操作后删除这个char*x吗?还是无关紧要?sprintf中的{0}、{1}、{2}是什么?什么是delete[x]?@user1240679这是一个打字错误,se更正的版本。如果分配了
new
,你应该删除字符*,否则这是内存泄漏。@LuchianGrigore:我郑重建议结合
std::vector
snprintf
,以避免泄漏和缓冲区溢出。请参阅。OP已经提到
boost
c不使用:/你知道Boost不会向你的二进制文件添加任何依赖关系,对吗?(当然,它会添加依赖于源代码),据我所知,C++没有优化这个,所以这会复制每个操作的字符串,首先创建代码> A+''/Cuff> >,<代码> A+'+B等。
#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";
}
#include <sstream>

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

std::stringstream ostr;
ostr << a << " " << b << " > " << 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());
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);