背景
我正在使用 boost格式库格式化某些文本。我的输入是一个uint8_t
数组。这是我使用的代码:
#include <array>
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <boost/format.hpp>
int main(int ac, const char * av[]){
std::string nameStr = "HELLO, WORLD";
std::array<uint8_t, 30> nameArr={0x48, 0x45, 0x4e, 0x4c, 0x4f, 0x20, 0x46, 0x52, 0x45, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
std::string convertedStr(std::begin(nameArr), std::end(nameArr));
std::cout << "nameStr.size():" << nameStr.size() << ", nameStr.length():" << nameStr.length() << ", nameStr:" << nameStr << std::endl;
std::cout << "convertedStr.size():" << convertedStr.size() << ", convertedStr.lenght():" << convertedStr.length() << ", convertedStr:" << convertedStr << std::endl;
std::ostringstream oss;
oss << boost::format("%-24s%c%-10d%8s") % nameStr % "#" % 512 % "999";
std::cout << oss.str() + '\n';
oss.str(std::string());
oss << boost::format("%-24s%c%-10d%8s") % convertedStr % "#" % 512 % "999";
std::cout << oss.str() + '\n';
return 0;
}
问题
上面的代码产生以下输出:
nameStr.size():10, nameStr.lenght():10, nameStr:HELLO, WORLD
convertedStr.size():30, convertedStr.lenght():30, convertedStr:HELLO, WORLD
HELLO, WORLD #512 999
HELLO, WORLD#512 999
oss << boost::format("%-24s%c%-10d%8s") % convertedStr % "#" % 512 % "999";
提供了不同的输出并忽略了-24
,并立即开始了以下部分。
我猜测数组的长度大于格式长度说明符,可能会导致这种情况,因此我在两个格式行都将-24
更改为-40
。这是输出:
nameStr.size():10, nameStr.lenght():10, nameStr:HELLO, WORLD
convertedStr.size():30, convertedStr.lenght():30, convertedStr:HELLO, WORLD
HELLO, WORLD #512 999
HELLO, WORLD #512 999
问题
我的代码有问题吗?
如何正确格式化从uint8_t
数组转换而来的字符串?