C ++将元素分配给映射值时访问错误

问题描述 投票:0回答:1

所以问题解释了问题...

背景:

我正在尝试从HackerRank解决this problem。>

基本上是一个html标签解析器。保证有效输入,属性仅是字符串。

我的方法

我创建了一个自定义Tag类,该类可以存储其他map<string,Tag>Tag以及属性map<string,string>。解析似乎工作正常。

问题

在查询期间,以下查询/ html组合出现BAD_ACCESS错误:

4 1
<a value = "GoodVal">
<b value = "BadVal" size = "10">
</b>
</a>
a.b~size

[当我尝试从b访问a标记时发生错误。具体来说,它位于下面的t=t.tags[tag_name]第118行中。

代码
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <map>
#include <stack>
using namespace std;

class Tag {
public:
    Tag(){};
    Tag(string name):name(name){};
    string name;
    map<string,Tag> tags = map<string, Tag>();
    map<string,string> attribs=map<string,string>();
};

int main() {
    int lines, queries;
    std::cin>>lines>>queries;

    std:string str;
    getline(cin, str);
    stack<string> open;
    auto tags = map<string, Tag>();
    for (int i = 0; i < lines; i++) {
        getline(cin, str);
        if (str.length()>1){
            // If it's not </tag>, then it's an opening tag
            if  (str[1] != '/') {
                // Parse tag name
                auto wordidx = str.find(" ");
                if (wordidx == -1) {
                    wordidx = str.length()-1.f;
                }
                string name = str.substr(1,wordidx-1);
                auto t = Tag(name);

                string sub = str.substr(wordidx);
                auto equalidx=sub.find("=");

                // Parse Attributes
                while (equalidx != std::string::npos) {
                    string key = sub.substr(1,equalidx-2);
                    sub = sub.substr(equalidx);
                    auto attrib_start = sub.find("\"");
                    sub = sub.substr(attrib_start+1);
                    auto attrib_end = sub.find("\"");
                    string val = sub.substr(0, attrib_end);
                    sub = sub.substr(attrib_end+1);

                    t.attribs[key] = val;
                    equalidx=sub.find("=");
                }

                // If we're in a tag, push to that, else push to the base tags
                if (open.size() == 0) {
                    tags[name] = t;
                } else {
                    tags[open.top()].tags[name]=t;
                }
                open.push(name);
            } else {
                // Pop the stack if we reached a closing tag
                auto wordidx = str.find(">");
                string name = str.substr(2,wordidx-2);

                // Sanity check, but we're assuming valid input
                if (name.compare(open.top())) {
                    cout<<"FUCK"<<name<<open.top()<<endl;
                    return 9;
                }
                open.pop();
            }

        } else {
            std::cout<<"FUCK\n";
        }
    }

    //
    // Parse in queries
    //
    for (int i = 0; i < queries; i++) {
        getline(cin, str);
        Tag t = Tag();
        bool defined = false;


        auto next_dot = str.find(".");
        while (next_dot!=string::npos) {
            string name = str.substr(0,next_dot);
            if (defined && t.tags.find(name) == t.tags.end()) {
                //TAG NOT IN T
                cout<<"Not Found!"<<endl;
                continue;
            }
            t = !defined ? tags[name] : t.tags[name];
            defined = true;

            str = str.substr(next_dot+1);
            next_dot = str.find(".");
        }

        auto splitter = str.find("~");
        string tag_name = str.substr(0,splitter);
        string attrib_name = str.substr(splitter+1);

        if (!defined) {
            t = tags[tag_name];
        } else if (t.tags.find(tag_name) == t.tags.end()) {
            //TAG NOT IN T
            cout<<"Not Found!"<<endl;
            continue;
        } else {
            t = t.tags[tag_name];
        }
        // T is now set, check the attribute
        if (t.attribs.find(attrib_name) == t.attribs.end()) {
            cout<<"Not Found!"<<endl;
        } else {
            cout<<t.attribs[attrib_name]<<endl;
        }

    }

    return 0;
}

我尝试过的

通过在上面的行中将Tag x = t.tags[tag_name];定义为新变量,然后执行t = x;,这为什么会发生呢?

[此外,以下查询也将失败:a.b.c~height,但在尝试获取a.tags [“ b”]时,它在第99行失败。不知道为什么。我本来只是要进行上述修正,但这似乎是我做错了一个重要的核心问题。

我建议在IDE上运行它,并验证解析确实正确。

因此问题说明了问题...背景:我正在尝试通过HackerRank解决此问题。它基本上是一个html标签解析器。保证有效输入,属性仅是字符串。我的...

c++ dictionary hashmap exc-bad-access
1个回答
0
投票
t=t.tags[tag_name]
© www.soinside.com 2019 - 2024. All rights reserved.