2012-04-23 3 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%i、myvec、4);またはそれのようなものですか? –

+0

ある時点で文字列ストリームを調べたいと思うかもしれません - 'sprintf'はC++言語に残されているレガシーCの1つですが、タイプ拡張はできません。そして、あなたは独自のラッパーをベクトルの周りに作成して、単に 'ss << myvecwrappervar;'を実行することができます。はるかに多くのCのコーダーがC++のものに偽装しています:-) – paxdiablo

答えて

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. 

これは、結果文字列の最後に余分なスペースを追加します。それを避けたい場合はostream_iteratorの代わりにprevious answerに投稿したinfix_ostream_iteratorを使用することができます。

+0

私の解決策よりはるかに優れています:) – chris

関連する問題