【问题标题】:strtok_r is returning incorrect data after tokenizingstrtok_r 在标记化后返回不正确的数据
【发布时间】:2020-05-19 09:20:16
【问题描述】:

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

附:忽略我用来打印输出的logger函数,它只是类似于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】:

    根据手册页strtok_r 有一个const char * 分隔符。我猜你是通过指向一个随机终止的字符串来搞砸操作,即&amp;cDelimeter

    试试...

    const char *cDelimeter = ",";
    
    ...
    
    pRecordString = strtok_r(szMsgBuff,cDelimeter,&pRemainString);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2020-03-25
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多