我有一个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;
}'
在上面的代码中,注释#行无法正常工作,它正在打印其他一些值。除了这一切都很好,我不明白为什么会这样。
答案 0 :(得分:5)
c_str()
未分配新存储空间。文档说“通过进一步调用修改对象的其他成员函数,返回的指针可能会失效。”
,即每次重新分配令牌时,你已经存储在你结构中的char *都没有任何指示。
当你填充它时,你需要为每个结构字段分配一个新的char *字符串,并从token.c_str()strcpy为它。
答案 1 :(得分:0)
您的问题可能是未初始化的变量。当您使用logMessage lmsg;
声明结构时,您只需分配一部分堆栈。它包含随机数据,您不会对其进行更新,因此您可以重新获取随机数据。
您应该指定一个对结构使用良好默认值的构造函数。或者使用logMessage lmsg{};
您似乎稍后会初始化这些值,但由于您使用了切换功能,因此无法保证您可以使用该代码。
答案 2 :(得分:0)
我同意&#34; OmnipotentEntity&#34;,你需要在构造函数中初始化它们。
也可以为结构成员使用字符串而不是char *吗?
另外我会坚持要你重建代码,你可能会单独编译.c或.cpp。你修改了结构吗?