strtok_r在标记化后返回不正确的数据

问题描述 投票:0回答:1

[下面是我尝试使用strtok_r()来对字符串进行标记化以获取第一个标记的代码,在这种情况下为38。如果您以某种方式观察到输出,则错误地提取了我的令牌(将输出:38提取为8)。这是一个间歇性问题,并非每次都会发生。我无法为此找到任何解决方案。

P.S。忽略我用来打印输出的记录器功能,它类似于printf()

char cDelimeter = ',';
char *pRecordString = NULL;
char *pRemainString = NULL;
char szMsgBuff[MAX_BUFFER];

/*some code*/

LOG2(INF,"#ONLINEREQ : <%s>", szMsgBuff);
LOG3(INF,"#ONLINEREQ Before tokenizing: pRecordString<%s> pRemainString<%s>", pRecordString,pRemainString);
pRecordString = strtok_r(szMsgBuff,&cDelimeter,&pRemainString);
LOG3(INF,"#ONLINEREQ After tokenizing: pRecordString<%s> pRemainString<%s>", pRecordString,pRemainString);

输出

#ONLINEREQ : <38,CM|Member Name|Total ED|Net Buy Premium|Init Margin|ELMMargin|PreExpMargin|AdhocMargin|DeliveryMargin|UNDirectionalMRGN|CONMRGN|Crystallised MTM|Fwd Init Margin|Fwd Mntnce Margin|Total Utilization|Free Capital|MTM P/L|%ofEffectiveloss,^M
>
#ONLINEREQ Before tokenizing: pRecordString<(null)> pRemainString<(null)>
#ONLINEREQ After tokenizing: pRecordString<8> pRemainString<CM|Member Name|Total ED|Net Buy Premium|Init Margin|ELMMargin|PreExpMargin|AdhocMargin|DeliveryMargin|UNDirectionalMRGN|CONMRGN|Crystallised MTM|Fwd Init Margin|Fwd Mntnce Margin|Total Utilization|Free Capital|MTM P/L|%ofEffectiveloss,^M
>
c++ c c-strings strtok
1个回答
0
投票

根据手册页,strtok_r具有const char *分隔符。我猜想您是通过指向随机终止的字符串(即&cDelimeter)来搞砸操作。

尝试...

const char *cDelimeter = ",";

...

pRecordString = strtok_r(szMsgBuff,cDelimeter,&pRemainString);
© www.soinside.com 2019 - 2024. All rights reserved.