将char向量解析为std :: map <string,string =“”> </string,>

时间:2014-07-21 10:27:47

标签: c++

我有一个unsigned char值的向量。里面的数据是键和值,格式为&#34; key = value&#34;。每对由'\0'字符终止,最后一对由双'/0'终止。值可以包含&#34; =&#34;同样,这个分隔符不应该是该对的标准,只有终止'\0'

从单个unsigned char的这个向量我想得到一个std::map<std::string, std::string>对象。 什么是通过矢量并填充地图的有效方法? 提前谢谢!

此代码找到所有对,但是在打印它们时,我的控制台似乎搞砸了,所以我怀疑无效字符......也许这与我使用unsigned char的事实有关?

unsigned char *env, *nxt;
std::string delimiter = "=";
std::string line;
std::map<string, string> myMap;

for (env = &myVector[0]; *env != '\0'; env = nxt + 1)
    {

        for (nxt = env; *nxt != '\0'; ++nxt)
        {

            if (nxt >= &myVector[myVector.size()])
            {
                printf("string not terminated\n");
                return -1;
            }
        }

        line = std::string(env, env + myVector.size());
        myMap.insert(std::pair<string, string>(
            line.substr(0, line.find(delimiter)),
            line.substr(line.find(delimiter) + 1, line.size())));

    }

1 个答案:

答案 0 :(得分:1)

由于密钥不能包含=符号,因此非常简单:

  1. 拆分(生成所有位置)零个字符。
  2. 在第一个=上拆分创建的条目。
  3. 使用生成的区域作为键/值。
  4. 为了使事情更清晰(比你的双嵌套循环,ew),我使用一些合理的数据结构来标记缓冲区中的虚拟字符串(如果你想避免复制),例如{{1 }}

    因此,我认为函数的签名(在这种情况下,它们的实现比我们的实现更多)可能如下所示:

    pair<unsigned, unsigned>

    那些相当简单;我的代码设计OCD告诉我using BufferRange = pair<unsigned, unsigned>; using BufferEntry = pair<BufferRange, BufferRange>; list<BufferRange> splitOnZeroes(Buffer const& b); BufferEntry splitOnEquality(BufferRange const& br, Buffer const& b); void addToMap(map<string, string>& m, BufferEntry const& p) 可以是一个不仅包含数字索引的类型,还包含对缓冲区本身的引用。将其(如果需要)更改为练习。