Sprintf()错误

时间:2011-01-07 09:55:30

标签: c++ printf

我的项目中有一个Binary2String()

长期以来效果很好。但是vec[0] = 255 sprintf(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]); } } 引发了异常。

原始代码,

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

然后我修复了这个bug,我无法理解vector和sprintf()完成了。

有意义吗? (我是C ++的新手。谢谢你)

{{1}}

1 个答案:

答案 0 :(得分:4)

首先,%02d格式不正确,因为值最多可达3位数(%03d更合适)。正如Chris在下面的评论中所述,%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();
}