Read the ads中的ads为啥要加s?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Read the ads中的ads为啥要加s?相关的知识,希望对你有一定的参考价值。

您好 ads是单词advertisement的简写形式,其意思是:广告。 参考技术A ad = 广告、ads = 很多广告
所以Read the ads = 读这些广告

为啥 const char* 不能与 boost 的 stringstream 和 read_json 一起使用?

【中文标题】为啥 const char* 不能与 boost 的 stringstream 和 read_json 一起使用?【英文标题】:Why const char* is not working with stringstream and read_json of boost?为什么 const char* 不能与 boost 的 stringstream 和 read_json 一起使用? 【发布时间】:2015-12-04 16:05:38 【问题描述】:

我正在尝试将字符指针传递给将在内部使用字符串 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();

【问题讨论】:

请不要用c标记这个问题。 【参考方案1】:

您正在返回指向在 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 中找到该字符串并返回指向它的指针。问题是它不会以空值终止(因此您还需要返回长度)。

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

【讨论】:

我确认问题不在于临时对象。我通过创建全局字符串并从全局字符串返回 char * 来修改代码。但我面临同样的问题。还有一件事是第一次调用getParameterValue()时,我把print语句放在read_json()后面来检查ptr的值,此时ptr已经损坏了。 @kadina 它是 const char * 所以很难相信它被修改了,你也把它放在 stringstream 里面,这肯定不会改变它。也许这个json中没有Usernameproblem is not with temporary object - 这不是真的,你只是有不止一个问题:-) 你当前的全局变量解决方案是可以的,直到你尝试从多个线程中使用你的函数,或者尝试将返回值存储在某个地方。 用户名存在于 json 字符串中。我使用参数“用户名”删除了对 getString() 的调用,而是在 someFunc() 中的 getString() 之后打印了 ptr,它正在打印损坏的字符串。 我的想法已经不多了。我仍然不确定如何调试此问题以及如何修改 const char* ptr。 你能添加你的 getDiagnosticGroupValue 实现吗?

以上是关于Read the ads中的ads为啥要加s?的主要内容,如果未能解决你的问题,请参考以下文章

Read the ads,Match the titles with the

连接到 Azure AD 时,UWP 中的 OIDCClient“指定的协议未知”异常

为啥 Facebook Ads 的 MediaView 会重复图片 3 次?

将广告平台(FB Ads、Google Ads、My Target)中的数据导出到 Prometheus 以在 Grafana 中可视化

E. Madoka and The Best University(数论&gcd)

E. Madoka and The Best University(数论&gcd)