57

我正在尝试做一些非常简单的事情,但是,经过一个小时的搜索,我找不到合适的答案,所以我必须遗漏一些相当明显的东西。

我正在尝试动态创建用于 ifstream 的文件名。虽然我知道有多种方法可以做到这一点,但我决定创建一个 std::string,并使用 stringname.c_str 转换为 const。

然而,问题是我需要使用混合变量和预定义文本值来创建字符串。我收到编译器错误,所以这一定是语法问题。

std::string var = "sometext" + somevar + "sometext" + somevar;

谢谢!

4

7 回答 7

76

您是否考虑过使用字符串流?

#include <string>
#include <sstream>

std::ostringstream oss;
oss << "sometext" << somevar << "sometext" << somevar;
std::string var = oss.str();
于 2012-04-18T22:54:36.013 回答
35

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

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar);  
于 2014-09-17T16:26:49.083 回答
32
std::string var = "sometext" + somevar + "sometext" + somevar;

这不起作用,因为添加是从左到右执行的,并且"sometext"(第一个)只是一个const char *. 它operator+无话可说。最简单的解决方法是:

std::string var = std::string("sometext") + somevar + "sometext" + somevar;

现在,从左到右的+操作列表中的第一个参数是 a std::string,它有一个operator+(const char *)。该运算符产生一个字符串,使链的其余部分工作。

您还可以将所有操作设置为 on var,这是 a std::string,因此具有所有必要的运算符:

var = "sometext";
var += somevar;
var += "sometext";
var += somevar;
于 2012-04-18T23:02:34.610 回答
7

使用 c++20 的新方法是使用format

#include <format>

auto var = std::format("sometext {} sometext {}", somevar, somevar);
于 2019-12-04T09:39:57.430 回答
3

另请参阅boost::format

#include <boost/format.hpp>

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str();
于 2013-12-17T09:45:59.570 回答
3

您还可以使用 sprintf:

char str[1024];
sprintf(str, "somtext %s sometext %s", somevar, somevar);
于 2012-04-18T22:57:21.193 回答
0

你可以有类似的东西:

#define Compose(...) ComposeFn({ __VA_ARGS__ })

std::string ComposeFn(std::initializer_list<std::string> strList) {
    std::ostringstream ss;
    for(std::string str : strList) {
        ss << str;
    }
    return ss.str();
}

然后像这样使用它:

int errcode = 404;
std::cout << Compose("[ERROR]: (", errcode, ") doesn't exist") << std::endl;

Compose宏只是为了避免使用大括号。你也可以使用可变参数函数,但是嗯

于 2021-07-21T12:50:43.367 回答