我想将一个字符串转换为Json格式并返回一个字符串向量作为答案

时间:2017-06-16 08:44:50

标签: c++ json string

这是问题的输入和输出格式。 在这种情况下,[]和{}只是可接受的大括号。 假设这个问题可以消除空间字符。 您的解决方案应返回一个字符串列表,其中每个条目对应一行。字符串中不应包含“\ n”字符。

输入:["foo", {"bar":["baz",null,1.0,2]}]

输出:

[
    "foo", 
    {
        "bar":
        [
            "baz", 
            null, 
            1.0, 
            2
        ]
    }
]

这是我的代码我得到分段错误,我是c ++的新手,无法在程序中找到错误请帮助

vector<string> Solution::prettyJSON(string A) {

    int tabcount=0,j=0;
    vector<string> res;
    cout<<"0st check \n";

    for(int i=0;A[i];i++){


        if(A[i]=='{' || A[i]=='['){

            if(i==0)
                res[j].push_back(A[i]);
            else{    
                j++;
                res[j].insert(0,tabcount,'\t');    
                res[j].push_back(A[i]);
            }

            j++;
            tabcount++;
        }
        else {
            if(A[i]=='}' || A[i]==']'){

                tabcount--;
                j++;
                res[j].insert(0,tabcount,'\t');
                res[j].push_back(A[i]);

                j++;
                }
            else{ 
                if(A[i]==','){

                    res[j].push_back(A[i]);
                    j++;
                    res[j].insert(0,tabcount,'\t');

                    }
                    else{
                        res[j].push_back(A[i]);

                    }
            }
        }
    }

    return res;
}

1 个答案:

答案 0 :(得分:0)

首先,请注意有许多C ++ JSON解析和操作以及预处理库,其中一些非常紧凑且易于使用,只占用一个标头。考虑重复其中一个,这将帮助您避免在编写自己的时候会发现的许多陷阱。

现在,我假设你没有调试过这个。例如,通过visual studio运行它会显示崩溃产生的确切行:

res[j].push_back(A[i]);

i为零,所以这是第一个字符。 j也为零,但更重要的是res大小也为零。这意味着您正试图引用res中不存在的条目,这当然会导致您的应用程序崩溃。

如果j等于或大于res.size(),您将遇到此问题,并且因为您从未将任何条目推送到res,所以此代码无法正常工作。这可能表明你不熟悉使用向量,但这并不是教你如何做到这一点的地方。

无论如何,作为最小修复,如果我在for循环之前和res.push_back("");的每个实例之后添加j++,我会得到以下结果:

[
"foo",

        {
"bar":
                [
"baz",
                        null,
                        1.0,
                        2
                ]

        }

]