2014-05-14 36 views
0

我有一條String消息,我將字符串拆分並將其存儲在一個結構中。C++中的結構值打印不正確

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; 
}' 

在上面的代碼註釋#行不能正常工作,它正在打印一些其他值。除了這一切工作正常,我不明白爲什麼會發生。

+1

你可以在你的問題中包含控制檯的輸出(出錯的行)嗎?由於我們沒有你的輸入數據,所以很難猜到...... – tofi9

回答

5

c_str()未分配新存儲。文檔說:「返回的指針可能會因修改對象的其他成員函數的進一步調用而失效。」

即,每次標記被重新分配,你已經存儲在你的結構中的char *都不會指向任何東西。

您需要爲每個結構字段分配一個新的char *字符串,並將strcpy從token.c_str()填充到該結構字段。

+1

或使用'strdup'。無論哪種情況,OP都需要「刪除」或「釋放」分配的字符串。 – Praetorian

+0

非常感謝它正在工作...... – Ali786

+0

確保您初始化結構的所有字段(根據其他答案)也是非常好的建議,儘管在這種情況下它不是直接的問題。 –

0

你的問題可能是未初始化的變量。當您使用logMessage lmsg;聲明結構時,您只需分配一部分堆棧。它包含隨機數據,而你沒有更新它,所以你得到的是隨機數據。

您應該指定一個構造函數,該構造函數使用結構的良好默認值。或者使用初始化結構零初始化結構logMessage lmsg{};

它看起來像稍後初始化值,但因爲您使用的是開關,所以不能保證您將運行該代碼。

+1

對於downvoter。這個答案仍然是部分正確和有用的,因爲作者指出'int cefVersion'也給出了不好的數據,所以我現在就放棄它。然而@ AndrewMcGuinness的回答肯定會突出顯示代碼中更多的問題。 – OmnipotentEntity

+0

泰克斯,你是對的,我犯了一個錯誤。 – Ali786

0

我同意「OmnipotentEntity」,你需要在構造函數中初始化它們。

你也可以使用字符串而不是char *作爲結構體的成員嗎?

另外,我會堅持你重建代碼,你可能會編譯.c或.cpp indivisually。你修改了結構嗎?