2011-01-07 102 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]); 

} 
} 

然後我固定的bug,因爲這,我無法理解的矢量和sprintf()完成。

它有意義嗎? (我是新來的C++。謝謝)所有的

 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

首先,%02d不正確的格式,因爲值可以達到3個位數(%03d會更合適)。正如克里斯在下面的評論中所述,%03hhu將是技術上正確的說明符(瞭解%03hhu,看看this cheat sheet)。第二,你需要5個字節來存儲字符「2」,「5」,「5」,「」,0(你在%02d的末尾有一個額外的空間)。要麼刪除空間,要麼將緩衝區擴展到至少5個字符(如你所做的那樣)。

最後,你可以轉換成字符串更加可靠這樣:

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_合適的,因爲它不是一個符號類型,它不是`int`大小。 – 2011-01-07 10:05:32