我的项目中有一个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]);

 }
}


然后我修复了这个错误,因为我无法理解矢量和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]);

最佳答案

首先,%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();
}

10-06 15:06