2012-04-23 61 views
1

我想弄清楚如何在運行時定義的字符串的C++ sprintf調用中使用運行時定義的列表。該字符串已經在那裏有令牌,我只需要以某種方式調用它來匹配字符串中的儘可能多的參數。基本上把下面的4個調用編譯成一個可以適用於所有這些調用的調用,這些調用沿着sprintf(緩衝區,「這是我的帶有args%i的字符串」,myvec)。Sprintf使用運行時定義的字符串和列表

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]); 

我談過我的同事,他們不認爲這樣的事情存在,所以我想我把它放在那裏。有任何想法嗎?

+0

我想我不太關注。函數如何知道有多少個參數?你的意思可能是'sprintf(緩衝區,「這是我的字符串與args%我」,myvec,4);'或類似的東西? – 2012-04-23 01:52:14

+0

您可能想在某個時候查看字符串流 - 「sprintf」是C++語言中遺留的C語言之一,但它不是類型可擴展的。然後,您可以創建自己的矢量包裝器,只需:'ss << myvecwrappervar;'。有太多的C編碼器僞裝成C++的:-) – paxdiablo 2012-04-23 02:13:43

回答

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

書面,這會在結果字符串的末尾附加一個額外的空格。如果你想避免這種情況,你可以使用我發佈在previous answer中的infix_ostream_iterator來代替ostream_iterator這個用途。

+0

絕對比我的解決方案好:) – chris 2012-04-23 02:28:01

相關問題