2012-09-26 32 views
-1

是否有一個快速的方法來做到無i++格式化字符串以遞增的整數C++

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

我需要用8個或更多的對和代碼看起來可怕做到這一點,重複以下..

+2

它不僅看起來可怕,它是不確定的行爲。 –

+0

這裏有很多未定義的行爲。 – Joe

+0

也許你需要創建自己的功能,以保持代碼儘可能乾淨。看看vprintf(http://www.manpagez.com/man/3/vprintf/)和可變參數的函數(http://stackoverflow.com/questions/1657883/variable-number-of-arguments-in- c)根據 – Neozaru

回答

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; 
+0

我會做這樣的感謝 – AlasdairC

4

參數的評估順序未指定。另外,如果沒有中間順序點,則不能兩次修改變量。所以這樣做,而不是:

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

我不知道兩次修改變量的規則。謝謝。 (該命令不重要)。 – AlasdairC

+1

真的嗎?你不關心,如果輸出是'富-1,嗒嗒-2,橙3'或'富-3,胡說-1,橙2'或'FOO-2,等等-3,橙1'要麼 ...? –

+0

沒有,對於這種特殊的情況不要緊 – AlasdairC

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