c++ - strtok_r 在标记化后返回不正确的数据
问题描述
下面是我尝试使用 strtok_r() 来标记我的字符串以获取第一个标记的代码,即在这种情况下为 38。
如果您以某种方式观察输出,我的令牌被错误地提取(参考输出:38 被提取为 8)
这是一个间歇性问题,并非每次都会发生。我无法找到任何解决方案。
PS忽略我用来打印输出的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
>
解决方案
根据手册页strtok_r
有一个const char *
分隔符。我猜你是通过指向一个随机终止的字符串来搞砸操作,即&cDelimeter
.
尝试 ...
const char *cDelimeter = ",";
...
pRecordString = strtok_r(szMsgBuff,cDelimeter,&pRemainString);
推荐阅读
- ios - 如何使用文档数量的价值?
- r - 如何将标签添加到 facet_wrap(ed) geom_count 图?
- ssl - 如何在没有证书的客户端的情况下为 mqtts 配置 Mosca?
- c# - 在 EF Code First 中使用视图与迁移冲突
- c# - 操作多个datagridview
- visual-studio - VS 2019 用鼠标导航
- c# - 对于包含多行 LIST 的条目,如何选择使用 LINQ?
- reactjs - 使用钩子将道具从父组件传递给子组件?
- c# - 为什么我的 xaml 与材料设计网站上的示例相同时会出现错误?
- java - Hbase MapReduce:如何使用自定义类作为映射器和/或减速器的值?