1

実行定義文字列の C++ sprintf 呼び出しで実行時定義リストを使用する方法を理解しようとしています。文字列には既にトークンが含まれています。文字列内のできるだけ多くの引数に一致するように、何らかの方法で呼び出しを行う必要があります。基本的に、以下の 4 つの呼び出しを、sprintf (buffer, "This is my string with args %i", myvec) の行に沿って、それらすべてに対して機能する単一の呼び出しにコンパイルします。

std::vector<int> myvec = {0, 1, 2, 3, 4};

char buffer [500];

sprintf (buffer, "This is my string with args %i", myvec[0], myvec[1], myvec[2], myvec[3], myvec[4]);

sprintf (buffer, "This is my string with args %i %i", myvec[0], myvec[1], myvec[2], myvec[3], myvec[4]);

sprintf (buffer, "This is my string with args %i %i %i", myvec[0], myvec[1], myvec[2], myvec[3], myvec[4]);

sprintf (buffer, "This is my string with args %i %i %i %i", myvec[0], myvec[1], myvec[2], myvec[3], myvec[4]); 

私は同僚と話しましたが、彼らはそのようなものは存在しないと考えているので、公開しようと思いました. 何か案は?

4

2 に答える 2

1

少なくとも、あなたが達成しようとしていることを理解できれば、次のようなことから始めます。

std::ostringstream stream("This is my string with args ");

std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<int>(stream, " "));

// stream.str() now contains the string.

書かれているように、これは結果文字列の最後に余分なスペースを追加します。それを避けたい場合は、この用途の代わりに以前の回答infix_ostream_iteratorに投稿したものを使用できます。ostream_iterator

于 2012-04-23T02:27:07.807 に答える
0

あなたはそれを自分で行うことができます。ベクトルを受け取り、適切な文字列を返す関数を作成します。テストする時間はありませんが、

string vecToString (const vector<int> &v)
{
    string ret = "This is my string with args ";

    for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        istringstream ss;
        ss << *it;
        ret += ss.str() + (it != v.end() ? " " : "");
    }

    return ret;
}
于 2012-04-23T01:55:16.967 に答える