0

我有以下代码将数据添加到 rapidjson::Document,声明如下:

rapidjson::Document rest;
rest.SetObject();

在一个循环中。

Value v(value.c_str());
stringstream ss;//create a stringstream
ss << "a" << colnum;
const char* colnumstr = ss.str().c_str();     
cout << "json: colnumstr = \"" << colnumstr << "\", value = \"" << value << "\"" << endl;
rest.AddMember(colnumstr,v,rest.GetAllocator());

当循环结束时,我将 json 作为字符串添加到地图中,如下所示:

StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
rest.Accept(writer);

string reststring = buffer.GetString();
cout << "Pushing " << reststring << " to map" << endl;
parseddata["rest"].push_back(reststring);

这是奇怪的一点:

json: colnumstr = "a1", value = "13745438"
json: colnumstr = "a2", value = "#N/A"
json: colnumstr = "a9", value = "Top 19"
Pushing {"a1":"9999\u0000438","99":"#N/A","31":"Top 19"} to map

某些价值观似乎正在发生变化。但我不知道如何或为什么。

4

1 回答 1

2

我看到的第一件事是这个错误(可能与您的问题无关):

const char* colnumstr = ss.str().c_str();

这是错误的,为什么:

ss.str():返回字符串实例的副本。

.c_str():获取该字符串的内部数据

但是字符串实例在打印结果之前销毁了下一行,因此 colnumstr 指针指向内存中无效的内容。希望大多数时候数据仍然有效......但在某些情况下,数据可以被其他东西覆盖。

正确的解决方案是

string colnumstrObj = ss.str();
const char* colnumstr = colnumstrObj .c_str();

colnumstrObj在函数结束时被销毁,而不是立即......

于 2012-12-12T14:30:33.390 回答