【问题标题】:strtok and function callstrtok 和函数调用
【发布时间】:2010-11-19 15:53:39
【问题描述】:

我有这种极其奇怪的行为:

在下面的代码中:如果我注释对 MyLogger 的调用,那么一切正常,即我得到了 sTempNr 标记并打印了 4 个标记。 但是,如果我取消注释对 MyLogger 进行日志记录的调用,那么只会发生一次迭代,并且在其他具有类似代码的测试类中,会发生 4 次以上的循环,并将冗余信息发送到 MyLogger。

因此,我使用 Purify 工具检查了 MyLogger 中是否存在一些内存问题。 找不到。 MyLogger 使用 vaargs 来提取 args 和 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,".");
}

【问题讨论】:

    标签: c string strtok


    【解决方案1】:

    strtok() 内部保留了一些静态数据,因此MyLogger 可能直接或间接调用strtok()

    strtok() 替换为strtok_r()strtok() 的可重入版本)以解决此问题。

    【讨论】:

    • 这就是为什么我从不使用 strtok(),并认为它是 C 语言中最愚蠢的事情。
    • @David 喜欢任何工具 - 如果您不小心使用它,您会伤害自己(或他人),但这并不意味着您永远不应该使用该工具。
    • 他是对的。 strtok() 的问题与“粗心”的用户无关,完全限于糟糕的库设计。
    • 谢谢,真的有效!。您能否与我分享一份 C 陷阱/注意事项列表,以便我避免这些错误?
    • @techzen 有很多 :) 一般规则 - 如果您要使用之前没有经验的功能,请仔细阅读该功能的手册页 - man 通常指定要注意的内容。
    【解决方案2】:

    记录器是否在调用 strtok?

    【讨论】:

      【解决方案3】:

      MyLogger 也使用 strtok 吗?请注意,strtok 不是无状态的。

      【讨论】:

        【解决方案4】:

        听起来 MyLogger 正在破坏 sTempStr 中的字符串。调用 MyLogger 后再次尝试打印。例如

         printf("in in TempStr[%s]\n",sTempStr);
         MyLogger("write","","Temp String[%s]",sTempStr);
         printf("in in TempStr[%s]\n",sTempStr);
        

        看看有没有什么变化

        【讨论】:

        • 即使是这样,也没有关系,因为 sTempStr 会在下一次调用 strtok() 时重新分配。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2019-12-15
        相关资源
        最近更新 更多