使用递增整数c ++格式化字符串

时间:2012-09-26 16:40:10

标签: c++ printf

如果不重复i++

,是否可以快速执行以下操作
int i = 0;
printf("foo-%d,blah-%d,orange-%d", i++, i++, i++);

我需要使用8对或更多对,并且代码看起来很可怕..

3 个答案:

答案 0 :(得分:4)

参数的评估顺序未指定。此外,如果没有插入序列点,则无法修改变量两次。所以这样做:

printf("foo-%d,blah-%d,orange-%d", i, i+1, i+2);
i+=3;

答案 1 :(得分:3)

由于您可以拥有8对或更多对,我建议您使用更易读且易于扩展的版本:

std::vector<std::string> vec_values = {"foo", "blah", "orange"};
for (size_t index = 0; index < vec_values.size(); ++index)
    std::cout << vec_values[index] << "-" << index;

答案 2 :(得分:1)

您可能会根据前缀来考虑它,而不是数字:

int i = 0;
std::vector<std::string> prefixes { "foo", "bar", "baz", "ham" };

bool first = false;
for (const auto& prefix : prefixes) {
    if (!first)
        std::cout << ',';
    std::cout << prefix << '-' << i++;
    first = false;
}

如果你不能使用基于C ++ 11范围的for,你可以完全写出来:

for (auto prefix = prefixes.begin(); prefix != prefixes.end(); ++prefix) {
//   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if (!first)
        std::cout << ',';
    std::cout << *prefix << '-' << i++;
    //           ~~~~~~~
    first = false;
}

或者,使用指数:

for (i = 0; i < prefixes.size(); ++i) {
//   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if (!first)
        std::cout << ',';
    std::cout << prefixes[i] << '-' << i;
    //           ~~~~~~~~~~~           ~
    first = false;
}