C ++:如何在字符串文字之间连接变量?

时间:2013-05-15 22:29:57

标签: c++ string concatenation

我需要一种在C ++中获取此PHP行为的方法:

$foo = "PHP";
$bar = "this is a " . $foo . " example.";

有什么东西接近,或者我是否需要做很多strcat

6 个答案:

答案 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。

C ++ 11

std::string的内部缓冲区现在保证是连续的。它也保证是空终止的。这意味着您可以将指针传递给第一个元素:

CreateProcess(..., &str[0], ...);

确保该函数仅覆盖内部数组中[0,size())内的索引。覆盖保证的空终止符并不好。

C ++ 03

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