1

我试图弄清楚如何在运行定义的字符串上的 C++ sprintf 调用中使用运行时定义的列表。字符串中已经有标记,我只需要以某种方式调用它以匹配字符串中尽可能多的 args。基本上是将下面的 4 个调用编译成一个对所有调用都有效的调用,类似于 sprintf(缓冲区,“这是我的带有 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 回答