我需要一种在C ++中获取此PHP行为的方法:
$foo = "PHP";
$bar = "this is a " . $foo . " example.";
有什么东西接近,或者我是否需要做很多strcat
?
答案 0 :(得分:11)
std::string
:
std::string foo = "C++";
auto bar = "this is a " + foo + " example.";
确保前两个操作数之一是std::string
,而不是const char *
或其他。
如下所述,此结果在CreateProcess
中用作char *
(LPSTR
)参数。如果参数为const char *
,则传递c_str()
是完全可以接受的。但是,它不是,这意味着您应该假设它修改了字符串。 MSDN说:
此函数的Unicode版本CreateProcessW可以修改此字符串的内容。
由于这是char *
,显然正在使用CreateProcessA
,所以我要说const_cast<char *>
应工作,但最好是安全的。< / p>
您有两个主要选项,一个用于C ++ 11及更高版本,另一个用于预C ++ 11。
std::string
的内部缓冲区现在保证是连续的。它也保证是空终止的。这意味着您可以将指针传递给第一个元素:
CreateProcess(..., &str[0], ...);
确保该函数仅覆盖内部数组中[0,size())内的索引。覆盖保证的空终止符并不好。
std::string
不保证是连续的或以空值终止的。我发现最好创建一个临时的std::vector
,它保证连续的部分,并将指针传递给它的缓冲区:
std::vector<char> strTemp(str.begin(), str.end());
strTemp.push_back('\0');
CreateProcess(..., &strTemp[0], ...);
再次注意MSDN:
系统在命令行字符串中添加一个终止空字符,以将文件名与参数分开。这会将原始字符串分为两个字符串以进行内部处理。
这似乎表明这里的null-terminator不是必需的,但是没有size参数,所以我不完全确定。
答案 1 :(得分:7)
是的,您可以使用std::string
:
std::string foo = "PHP";
std::string bar = std::string("This is a") + foo + std::string(" example.")
答案 2 :(得分:5)
在C ++中,您可以使用std::string
:
std::string foo = "C++"
std::string bar = std::string("this is a") + foo + " example.";
您需要std::string(...)
将第一个字符串转换为std::string
,否则它是const char *
,没有operator+
将其与字符串连接。
可能至少有5种其他方法可以做到这一点,就像在C ++中几乎一样。
[我的打字再次太慢了]
答案 3 :(得分:3)
C ++提供了字符串类。
string foo = "PHP";
string bar = string("this is a ") + foo + string(" example.");
答案 4 :(得分:2)
如果您将C ++与标准C ++库一起使用,则可以使用std::stringstream
来完成该操作。代码看起来像这样:
std::string const foo("C++");
std::stringstream bar;
bar << "this is a " << foo << " example";
std::string const result(bar.str());
如果由于某种原因你无法使用C ++标准库,那么你很可能会遇到strcat之类的问题。
答案 5 :(得分:2)
您可以使用std :: string。所以试试这个:
#include <string>
int main() {
std::string foo = "C++";
std::string bar = "this is a " + foo + " example.";
return 0;
}