为什么const char *无法与boost的stringstream和read_json一起使用?

女士

我试图将一个字符指针传递给函数,该函数将在内部使用字符串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已经损坏了。

getDiagnosticGrouapValue()的实现如下。

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终止(因此您还需要返回长度)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

const int和const char *(为什么使用指针?)

来自分类Dev

为什么strtok使用char *而不是const char *?

来自分类Dev

为什么 const char * 和 const char [] 作为函数参数被认为是等效的?

来自分类Dev

为什么XS子订阅使用const char *?

来自分类Dev

为什么要使用const char *形式的字符串

来自分类Dev

为什么XS子订阅使用const char *?

来自分类Dev

为什么data()和c_str()返回char const *,而operator []返回char&?

来自分类Dev

const char **和char **

来自分类Dev

为什么始终将const char []转换为const char *?

来自分类Dev

为什么`execvp`接受`char * const argv []`?

来自分类Dev

C ++为什么const LPSTR与const char *不同?

来自分类Dev

为什么const int需要extern而不是const char *

来自分类Dev

C ++为什么const LPSTR与const char *不同?

来自分类Dev

从“char”到“const char*”的无效转换[-fpermissive](idk为什么)

来自分类Dev

为什么我可以将字符串文字初始化为const char *和QString而不是QString *?

来自分类Dev

为什么取消引用字符串迭代器会产生一个 const char 引用?

来自分类Dev

将const char **与Template Specialization一起使用

来自分类Dev

为什么我的char *无法正确通过?

来自分类Dev

为什么DataInputStream无法正确读取char?

来自分类Dev

为什么使用char **会导致char *工作的段错误?

来自分类Dev

为什么char *和int *表现不同

来自分类Dev

什么注册const char * const * name; 是什么意思,为什么这个变量在函数之外?

来自分类Dev

为什么要使用Char而不是String?

来自分类Dev

为什么C不允许从char **到const char * const *的隐式转换(而C ++允许)?

来自分类Dev

为什么可以在main中返回const char *?

来自分类Dev

为什么参数中的默认char *必须为const?

来自分类Dev

为什么std :: string_view比const char *快?

来自分类Dev

为什么不将const char放在rodata段中?

来自分类Dev

为什么参数中的默认char *必须为const?

Related 相关文章

  1. 1

    const int和const char *(为什么使用指针?)

  2. 2

    为什么strtok使用char *而不是const char *?

  3. 3

    为什么 const char * 和 const char [] 作为函数参数被认为是等效的?

  4. 4

    为什么XS子订阅使用const char *?

  5. 5

    为什么要使用const char *形式的字符串

  6. 6

    为什么XS子订阅使用const char *?

  7. 7

    为什么data()和c_str()返回char const *,而operator []返回char&?

  8. 8

    const char **和char **

  9. 9

    为什么始终将const char []转换为const char *?

  10. 10

    为什么`execvp`接受`char * const argv []`?

  11. 11

    C ++为什么const LPSTR与const char *不同?

  12. 12

    为什么const int需要extern而不是const char *

  13. 13

    C ++为什么const LPSTR与const char *不同?

  14. 14

    从“char”到“const char*”的无效转换[-fpermissive](idk为什么)

  15. 15

    为什么我可以将字符串文字初始化为const char *和QString而不是QString *?

  16. 16

    为什么取消引用字符串迭代器会产生一个 const char 引用?

  17. 17

    将const char **与Template Specialization一起使用

  18. 18

    为什么我的char *无法正确通过?

  19. 19

    为什么DataInputStream无法正确读取char?

  20. 20

    为什么使用char **会导致char *工作的段错误?

  21. 21

    为什么char *和int *表现不同

  22. 22

    什么注册const char * const * name; 是什么意思,为什么这个变量在函数之外?

  23. 23

    为什么要使用Char而不是String?

  24. 24

    为什么C不允许从char **到const char * const *的隐式转换(而C ++允许)?

  25. 25

    为什么可以在main中返回const char *?

  26. 26

    为什么参数中的默认char *必须为const?

  27. 27

    为什么std :: string_view比const char *快?

  28. 28

    为什么不将const char放在rodata段中?

  29. 29

    为什么参数中的默认char *必须为const?

热门标签

归档