2011-01-07 72 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