结构值无法在c ++中正确打印

时间:2014-05-14 05:20:14

标签: c++ string c++11 struct

我有一个String消息,我正在分割字符串并将其存储在结构中。

 struct logMessage
 {
   int cefVersion;
   char *deviceVendor;
   char *deviceProduct;
   char *deviceVersion;
   int signatureID;
   char *eventName;
   int severity;
   char *objectIp;
   char *cs2;
   char *suser;
   int logonID;
   char *logonType;
}; 

我已将字符串拆分并将其存储在我的代码结构中。

'split(string str)
{       
            string logmsg=str;
    logMessage lmsg;
    string delimiter = "|";
    size_t pos = 0;
    string token;
    int tokens=1;
    while ((pos = logmsg.find(delimiter)) != string::npos) {
            token = logmsg.substr(0, pos);
            cout <<"\n"<< token <<endl;
            logmsg.erase(0, pos + delimiter.length());

        switch(tokens){

                case 1:lmsg.cefVersion=atol((char *)token.c_str());
                   cout<<"\t token="<<token.c_str();
                   break;
                case 2:lmsg.deviceVendor=(char *)token.c_str();
                   cout<<"\t token="<<token.c_str()<<"\tlmsg.deviceVendor="<<lmsg.deviceVendor;
                   cout<<"\nmessage stored in the sturcture=deviceVendor:"<<lmsg.deviceVendor;
                   break;
                case 3:lmsg.deviceProduct=(char *)token.c_str();
                   cout<<"\nmessage stored in the sturcture=deviceProduct:"<<lmsg.deviceProduct;
                   cout<<"\t token="<<token.c_str()<<"\tlmsg.deviceProduct="<<lmsg.deviceProduct;break;
                case 4:lmsg.deviceVersion=(char *)token.c_str();
                   cout<<"\t token="<<token.c_str();break;
                case 5:lmsg.signatureID=atol((char *)token.c_str());
                   cout<<"\t token="<<token.c_str();break;
                case 6:lmsg.eventName=(char *)token.c_str();
                   cout<<"\t token="<<token.c_str();break;
                case 7:lmsg.severity=atol((char *)token.c_str());
                   cout<<"\t token="<<token.c_str();break;

                }   

        tokens++;
        cout<<"\ntokens="<<tokens;
        //#cout<<"\nmessage stored in the sturcture=deviceProduct:"<<lmsg.deviceProduct;    
    }   

    //#cout<<"\nmessage stored in the sturcture=cefVersion:"<<lmsg.cefVersion;
    //#cout<<"\nmessage stored in the sturcture=deviceProduct:"<<lmsg.deviceProduct;


    //#cout<<"\nmessage stored in the sturcture=signatureID:"<<lmsg.signatureID;
    //cout<<"\nmessage stored in the sturcture=eventName:"<<lmsg.eventName;
    //cout<<"\nmessage stored in the sturcture=severity:"<<lmsg.severity;
    logmsg=str;
             std::cout << logmsg << std::endl;
}'

在上面的代码中,注释#行无法正常工作,它正在打印其他一些值。除了这一切都很好,我不明白为什么会这样。

3 个答案:

答案 0 :(得分:5)

c_str()未分配新存储空间。文档说“通过进一步调用修改对象的其他成员函数,返回的指针可能会失效。”

,即每次重新分配令牌时,你已经存储在你结构中的char *都没有任何指示。

当你填充它时,你需要为每个结构字段分配一个新的char *字符串,并从token.c_str()strcpy为它。

答案 1 :(得分:0)

您的问题可能是未初始化的变量。当您使用logMessage lmsg;声明结构时,您只需分配一部分堆栈。它包含随机数据,您不会对其进行更新,因此您可以重新获取随机数据。

您应该指定一个对结构使用良好默认值的构造函数。或者使用logMessage lmsg{};

对结构进行零初始化

您似乎稍后会初始化这些值,但由于您使用了切换功能,因此无法保证您可以使用该代码。

答案 2 :(得分:0)

我同意&#34; OmnipotentEntity&#34;,你需要在构造函数中初始化它们。

也可以为结构成员使用字符串而不是char *吗?

另外我会坚持要你重建代码,你可能会单独编译.c或.cpp。你修改了结构吗?