了解strtok_s

时间:2014-02-20 17:17:48

标签: c++ xml visual-studio-2010 console-application

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

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

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

控制台实际上是读取和解析6MB XML文件。到目前为止,我已经收到了“访问冲突读取位置0xcccccccc”的所有内容,其中包含以下代码:

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

当我将光标放在“& token”上时,我看到错误“token = 0xcccccccc”。

我想澄清一些事情:

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

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

显然,XML中发生了一些变化。所以,最后,考虑到这是解析一个6MB的文件(w / 870K文本行)和读取XML的C ++函数长达700多行,调试它的最佳方法是什么?不,切割我的手腕还没有被考虑......但是。

感谢。

3 个答案:

答案 0 :(得分:2)

将0作为第一个参数传递(NULL可能更具可读性)意味着“在字符串中查找下一个标记”。将0xcccccccc视为最后一个参数的值(“token”是错误的名称)会告诉您从未在字符串中搜索第一个标记。换句话说,从未对strtok_s(buf, "=". &token)进行过调用。或者,之前对strtok_s()的调用未保留“token”值。所以它不再知道需要搜索什么字符串。 KABOOM。

在任何一种情况下,代码中的硬错误都不受字符串本身的影响。

答案 1 :(得分:0)

首先,我会DIFF a"破坏" XML代码和工作代码。我认为你会发现破碎的东西比预期的要少。

0,或者将NULL作为第一个参数,只需重新使用令牌

答案 2 :(得分:0)

以下是link to MSDN,其中借助示例解释了strtok_s的用法。

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

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