Understanding strtok_s

Understanding strtok_s

本文关键字:strtok Understanding      更新时间:2023-10-16

我使用C++已经很久了,所以请耐心等待。

我是一名C#开发人员,但这个C++控制台应用程序坏了,我现在正在管理它。我目前正在用VS2010调试它。

由于保密性和代码量太大,我无法发布所有代码。

控制台本质上读取并解析一个6MB的XML文件。一切都正常,直到昨天,我收到了一个"读取位置0xcccccccc的访问违规",代码如下:

strtok_s(0, "=", &token);

当我将光标放在"&token"上时,我看到错误"token=0xccccccc"。

我想澄清几件事:

strtok_s(buf, "=", &token);
strtok_s(0, "=", &token);
strtok_s(0, "=", &token);

0作为参数在做什么?我假设在第一个*strtok_s*中,token将指向buf中char'='的第一个实例。但是在第二条指令中,"0"的用途是什么?它是否在令牌中查找'='?

显然,XML中发生了一些变化。最后,考虑到这是在解析一个6MB的文件(有870K行的文本),而读取XML的C++函数有700+行长,调试它的最佳方法是什么?不,割腕是没有条件的。。。然而

谢谢。

将0作为第一个参数传递(NULL可能更可读)意味着"在字符串中查找下一个令牌"。将0xcccccc视为最后一个参数的值("token"是错误的名称)告诉您从未搜索字符串中的第一个令牌。换句话说,从未对strtok_s(buf, "=". &token)进行过调用。或者之前对strtok_s()的调用没有保留"token"值。因此,它不再知道需要搜索什么字符串。卡博姆。

无论哪种情况,它都是代码中的一个硬错误,不受字符串本身的影响。

首先,我将区分一个"损坏"的XML代码和一个工作代码。我想你会发现坏了的少了。

0,或bette NULL作为第一个参数,将简单地重用令牌

这里有一个MSDN链接,它通过示例解释了strtok_s的使用。

当您至少调用strtok_s一次时,第一个参数可以为NULL,第三个参数已经包含指向最后找到的令牌的指针。在这种情况下,对strtok_s的下一次调用可以从上一次调用找到令牌的位置开始。

具体来说,在您的情况下,访问冲突通常表示指针中存在缓冲区溢出或垃圾。token变量出现问题,导致其值变为0xcccccccc。您需要指出token采用该值的代码,并找出导致溢出的原因。