2011-01-07 13 views
0

私のプロジェクトにBinary2String()があります。Sprintf()エラー

これは長い間うまく動作します。しかし、vec[0] = 255sprintf(temp, "%02d ", vec[i]);に設定すると例外が投げられました。このよう

オリジナルコード、

void Binary2String(const vector<unsigned char>& vec, string& result) 
{ 

if(vec.size() == 0) 
    return; 

for(size_t i = 0; i < vec.size(); i++) 
{ 
    char temp[4] = {0}; 
    sprintf(temp, "%02d ", vec[i]); 
    result.push_back(temp[0]); 
    result.push_back(temp[1]); 
    result.push_back(temp[2]); 

} 
} 

は、その後、私はこのようにバグを修正したが、私はベクトルとのsprintf()完了を理解することはできません。

意味がありますか?値が3桁(%03dがより適切であろう)まで行くことができるので、すべての

 char temp[6] = {0}; 
    sprintf(temp, "%02d ", vec[i]); 
    result.push_back(temp[0]); 
    result.push_back(temp[1]); 
    result.push_back(temp[2]); 
     result.push_back(temp[3]); 
    result.push_back(temp[4]); 

答えて

4

まず(私は。ありがとうC++に新しいです)、%02dは正しい形式ではありません。そして、クリスが以下のコメントの中で述べるように、%03hhuは、技術的に正しい指定子になります(%03hhuを理解するには、this cheat sheetを見てください)。

第2に、文字 "2"、 "5"、 "5"、 ""、0(%02dの末尾に余分なスペースがあります)を格納するには5バイトが必要です。空白を削除するか、バッファを少なくとも5文字に拡張します(これまでと同じように)。

最後に、あなたははるかに確実にこのよう文字列に変換することができます:それは符号付きの型ではなく、それは `int`サイズではありませんので、

template<typename T> std::string ToString(const T& in) { 
    std::basic_ostringstream<char> o; 
    if (!(o << in)) { 
     // error, throw an exception 
    } 
    return o.str(); 
} 
+1

'%の03hhu'は、_most_適切であろう。 –

+0

@Chris:true、答えを更新しました。 – Jon

+1

チートシートありがとうございました。私は年齢のようなものが欲しかった。誰かがそれを書く時間を取っていたことを知らなかった。 –