57

私は非常に単純なことをしようとしていますが、1時間ほど検索した後、適切な答えが見つからないため、かなり明白な何かを見逃しているに違いありません。

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;

+ここで、操作の左から右のリストの最初のパラメーターは、std::stringであり、これには。がありoperator+(const char *)ます。その演算子は文字列を生成し、チェーンの残りの部分を機能させます。

また、すべての操作をオンにすることもできますvar。これには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

sprintfを使用することもできます。

char str[1024];
sprintf(str, "somtext %s sometext %s", somevar, somevar);
于 2012-04-18T22:57:21.193 に答える
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 に答える
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 に答える