strtok 和函数调用
我遇到了这种极其奇怪的行为:
在下面的代码中:如果我注释对 MyLogger 的调用,那么一切正常,即我得到 sTempNr 标记并打印 4 个标记。 但是,如果我取消注释对 MyLogger 进行日志记录的调用,则只会发生一次迭代,并且在具有如下类似代码的其他测试类中,会发生循环超过 4 次,并将冗余信息发送到 MyLogger。
因此,我使用 Purify 工具检查以确定 MyLogger 中是否存在内存问题。 找不到任何。 MyLogger 使用 vaargs 提取参数并使用 vfprintf 调用进行打印。
我不知道如何进一步调试这段代码。任何指导将不胜感激!
char sTempNr[41] = "1129Z13589.2.9.10";
char *sTempStr;
sTempStr = NULL;
sTempStr = strtok(sTempNr,".");
while (sTempStr)
{
printf("in in TempStr[%s]\n",sTempStr);
//MyLogger("write","","Temp String[%s]",sTempStr);
sTempStr = strtok(NULL,".");
}
I have this extremely strange behavior coming :
In the below code: If I comment the call to MyLogger then everything works fine that is I get the sTempNr tokenized and 4 tokens are printed .
But if I uncomment the call to MyLogger for logging then only the iteration takes place once and in other testing class with similar code as below there is a looping taking place more than 4 times with redundant info being sent to MyLogger.
So, I checked with Purify tool to determine if there were some memory issues in MyLogger.
Could not find any. MyLogger is using vaargs to extract args and vfprintf call to print.
I am not sure how to debug this code further. Any guidance would be appreciated!.
char sTempNr[41] = "1129Z13589.2.9.10";
char *sTempStr;
sTempStr = NULL;
sTempStr = strtok(sTempNr,".");
while (sTempStr)
{
printf("in in TempStr[%s]\n",sTempStr);
//MyLogger("write","","Temp String[%s]",sTempStr);
sTempStr = strtok(NULL,".");
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
strtok()
在内部保留一些静态数据,因此MyLogger
可能直接或间接调用strtok()
。将
strtok()
替换为strtok_r()
(strtok()
的可重入版本)来解决此问题。strtok()
keeps some static data inside so probablyMyLogger
callsstrtok()
, either directly or indirectly.Replace
strtok()
withstrtok_r()
(reentrant version ofstrtok()
) to get around this problem.记录器是否正在调用 strtok?
Is the logger calling strtok?
MyLogger 也使用 strtok 吗?请注意,strtok 不是无状态的。
Is MyLogger using strtok as well? Note that strtok is not stateless.
听起来 MyLogger 正在损坏 sTempStr 中的字符串。尝试在调用 MyLogger 后再次打印它。例如
,看看是否有任何变化
Sounds like MyLogger is corrupting the string in sTempStr. Try printing it out again after the call to MyLogger. eg
and see if anything has changed