如何分解其中没有任何分隔符的CString?

时间:2017-06-09 12:00:06

标签: c++

我有一个CString,我想分成小字符串。它是一个由常量2字节标题和2字节页脚组成的字符串,但字符串的其余部分没有可辨别的模式。我需要根据大小分解它们:所以前两个字节成为标题,然后我需要提取下一个2,然后是3,依此类推。 (这些数字也没有任何模式)

示例:

CString test = "1010eefabbccde1f1f"

我需要

CString header = "1010";
CString test1  = "eefa";
CString test2  = "bbccde";
CString footer = "1f1f";

我读到sscanf用于此目的,但我只是设法将其拆分为int

示例:

CString test = '101022223333331010';
int a,b,c,d;
sscanf(test,"%02d%02d%03d%02d",&a,&b,&c,&d); 

这适用于仅包含数字的字符串。但是当我通过将%d更改为%s来对字符串执行相同操作时,异常会被提升。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我的理解是,如果输入string testvector<size_t> sizes大小,您希望将字符串拆分为这些大小,然后您希望获取这些部分,将它们视为十六进制数字,并在vector<int> result中返回。

我将假设您已经测试test以确保存在正确的字符数。我将假设大小包括页眉和页脚大小。

运行这样的事情之后:

const auto test = "1010eefabbccde1f1f"s;
const vector<size_t> sizes { 4U, 4U, 6U, 4U };
const auto result = accumulate(cbegin(sizes), cend(sizes), vector<int>(), [&, pos = 0U](auto& a, const auto& b) mutable {
    a.push_back(stoi(test.substr(pos, b), nullptr, 16));
    pos += b;
    return a;
});

result将包含:

  

4112
  61178个
  12307678个
  7967

Live Example