Understanding strtok_s
Understanding strtok_s
我使用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
采用该值的代码,并找出导致溢出的原因。
- 如何在 c 中使用 2 个 strtok?
- 难以理解 strtok()
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- SFINAE: Understanding void_t and detect_if
- Understanding void func(A())
- 如何修复"调用 'strtok 没有匹配函数
- 如何在C 中不带有弦乐和strtok的情况下拆分字符串(提取单词)
- C++ 使用 Strtok 读取字符串字符时出错
- Understanding reinterpret_cast
- Understanding of static_cast in C++
- 使用标准库将循环替换为 strtok
- 用strtok分裂C弦
- 从文件(使用strtok()和strcpy())解开数据时进行分割故障
- strtok don't return nullptr
- 如何界定此文本文件?Strtok
- C++: problems with strtok
- 存储 strtok() 代币的值
- 拆分C++字符串(使用 strtok?),由逗号分隔,不使用外部库
- 在 if 语句中使用 strtok 标记
- Strtok如何处理新线