5

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

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

有什么接近的,还是我必须做很多strcat

4

6 回答 6

16

很容易std::string

std::string foo = "C++";
auto bar = "this is a " + foo + " example.";

只需确保前两个操作数之一是 a std::string,而不是两者const char *或其他东西。


如下所述,这个结果被用作CreateProcess( char *)LPSTR参数。如果参数是const char *,c_str()传入是完全可以接受的。但是,它不是,这意味着您应该假设它修改了字符串。MSDN 是这样说的:

此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。

既然这是char *,它显然正在使用CreateProcessA,所以我会说 aconst_cast<char *> 应该可以工作,但最好是安全的。

您有两个主要选项,一个用于 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:

系统将终止空字符添加到命令行字符串以将文件名与参数分开。这将原始字符串分成两个字符串进行内部处理。

这似乎表明这里的空终止符不是必需的,但没有大小参数,所以我不完全确定。

于 2013-05-15T22:31:35.823 回答
8

是的,您可以使用std::string

std::string foo = "PHP";
std::string bar = std::string("This is a") + foo + std::string(" example.")
于 2013-05-15T22:31:56.880 回答
5

在 C++ 中,您可以使用std::string

std::string foo = "C++"
std::string bar = std::string("this is a") + foo + " example.";

您需要将std::string(...)第一个字符串变成 a std::string,否则它是 a const char *,它不必operator+将它与字符串连接起来。

可能至少有 5 种其他可能的方法可以做到这一点,就像在 C++ 中几乎总是一样。

【又是打字太慢】

于 2013-05-15T22:33:47.560 回答
3

C++ 提供了字符串类。

string foo = "PHP";
string bar = string("this is a ") + foo + string(" example.");
于 2013-05-15T22:32:37.180 回答
3

如果您将 C++ 与标准 C++ 库一起使用,则可以使用 astd::stringstream来完成。代码看起来像这样:

#include <sstream>

std::string const foo("C++");
std::stringstream bar;

bar << "this is a " << foo << " example";

std::string const result(bar.str());

如果由于某种原因您不能使用 C++ 标准库,那么很遗憾您会被 strcat 之类的东西困住。

于 2013-05-15T22:33:49.060 回答
3

您可以为此使用 std::string 。所以试试这个:

#include <string>

int main() {
    std::string foo = "C++";
    std::string bar = "this is a " + foo + " example.";
    return 0;
}
于 2013-05-15T22:34:20.683 回答