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

formatting string with incrementing integer c++

本文关键字:C++ 格式化 字符串 整数      更新时间:2023-10-16

有没有一种快速的方法可以在不重复i++的情况下执行以下操作

int i = 0;
printf("foo-%d,blah-%d,orange-%d", i++, i++, i++);

我需要用 8 对或更多对来做到这一点,代码看起来很糟糕。.

参数的计算顺序未指定。此外,如果没有干预序列点,则不能对变量进行两次修改。所以这样做:

printf("foo-%d,blah-%d,orange-%d", i, i+1, i+2);
i+=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;

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

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;
}