c++ - 为什么 const char* 不适用于 stringstream 和 boost 的 read_json?

标签 c++ json boost

我正在尝试将字符指针传递给将在内部使用字符串的 read_json 函数。但是从函数中出来后,指针的内容就变了。下面是代码。

string tempstr;
void someFunc()
{
    const char *ptr = getDiagnosticGroupValue("Device.ManagementServer");
    printf("string : %s\n", getParameterValue(ptr, "URL"));
    printf("string : %s\n", getParameterValue(ptr, "Username"));
}
const char* getParameterValue(const char *jsonstring, const char* param)
{
    return getString(jsonstring, param);
}
const char* getString(const char *jsonstring, const char* param)
{
    stringstream jsonstringstream;
    jsonstringstream << jsonstring;

    string paramstr(param);

    try
    {
        boost::property_tree::ptree pt;
        boost::property_tree::read_json(jsonstringstream, pt);
        tempstr = pt.get<string>(paramstr);
        return tempstr.c_str();
    }
    catch(...)
    {
        jsonstringstream.clear();
        jsonstringstream.str("");
        cout << "Node Doesn't exist" << endl;
        return "N/A";
    }
}

对于第一个节点 (URL),它返回正确的值,我能够在 someFunc() 中打印字符串。但是 ptr 内容正在修改(不再是 json 格式字符串)。所以第二次,当调用 getParameterValue() 时,read_json 抛出异常说不是 json 格式。我想知道为什么即使我声明为 const char* ptr,ptr 的内容也会发生变化。任何人都可以让我知道如何解决这个问题。

我确认问题不在于临时对象。我通过创建全局字符串并从全局字符串返回 char * 来修改代码。但我面临着同样的问题。还有一件事是当第一次调用 getParameterValue() 时,我将 print 语句放在 read_json() 之后以检查 ptr 的值,此时 ptr 已经损坏。

getDiagnosticGroupValue() 的实现如下。

const char* getDiagnosticGroupValue(const char* group)
{
    VZUAL& vzual = VZUAL::getInstance();

    string groupStr(group, group + strlen(group));
    return vzual.Diagnostics.getGroupValue(groupStr).c_str();
}

const string PlatformDiagnostics::getGroupValue(const string& _groupName_, const string& DUMMY)
{
    boost::property_tree::ptree ptRead;
    boost::property_tree::ptree ptWrite;
    string path = _groupName_ + ".";
    stringstream ss;

    try {
        boost::property_tree::read_json(Resource::diagnosticsFile.c_str(), ptRead);
    }
    catch (boost::property_tree::json_parser::json_parser_error &je) {
        return Resource::defaultValue;
    }

    try {
        BOOST_FOREACH(boost::property_tree::ptree::value_type &v, ptRead.get_child(path))
        ptWrite.put(v.first.data(), v.second.data());
    }
    catch (...) {
    return Resource::defaultValue;
    }

    boost::property_tree::write_json(ss, ptWrite);
    return ss.str();
}

最佳答案

您正在返回指向在堆栈上创建的字符串的指针,在 getString 函数内。这是未定义的行为。

从您的代码中,所有变量:

string paramstr(param);
boost::property_tree::ptree pt;
boost::property_tree::read_json(jsonstringstream, pt);  
return (pt.get<string>(paramstr)).c_str();

表示这个字符串不是静态或全局创建的。

如果您要返回指向 jsonstring 某部分的指针,十可能您应该在 jsonstring 中找到该字符串并返回指向它的指针。问题是它不会以 null 终止(因此您还需要返回 lenght)。

其他解决方案是为 getString 提供一个 char 数组,该数组将从 getString 返回。但是你必须确保它足够大,如果太小则返回NULL,以便客户端代码可以提供更大的缓冲区。

关于c++ - 为什么 const char* 不适用于 stringstream 和 boost 的 read_json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092483/

相关文章:

C++ Stringstream 给变量赋了错误的值?

javascript - 将列表返回到 JSON 到 Angularjs

php - 在 android 中获取 HTML 响应而不是 JSON

java - 如何使用 Jackson 将 JSON 解析为带有小写键的 Map?

c++ - 如何使用 boost 预处理器生成访问器?

c++ - 具有不同模板参数的相同类不能访问彼此的私有(private)字段

c++ - 使用特征值求解线性方程组

c++ - 为什么这个 boost::variant::operator= 不调用编译?

c++ - 使用两个访问者 boost 图形库

c++ - LRU 缓存和多线程