【问题标题】:std::string::find_first_of does not return the expected valuestd::string::find_first_of 不返回预期值
【发布时间】:2011-12-03 13:30:42
【问题描述】:

我正在尝试用 C++ 创建 XML 解析器。我目前正在使用 cygwin 和 gcc 来编译和 gdb 来调试。我有这段代码:

const size_t mDataSize = mData.size();  
...  
size_t ltPos = mData.find_first_of('<', pos);  
if (ltPos==mData.npos) {  
...  

mData 在类中被声明为 private const std::string & 并保存 XML 文件内容。用gdb调试后发现如下:

(gdb) print pos  
$12 = 636  
(gdb) print mDataSize  
$13 = 2692  
(gdb) n  
141             size_t ltPos = mData.find_first_of('<', pos);  
(gdb) print ltPos  
$14 = 114  
(gdb) print pos  
$15 = 636  
(gdb) n  
143             if (ltPos==mData.npos)  
(gdb) print ltPos  
$16 = 4294967295  
(gdb) print mData[636]  
$17 = (const char &) @0xb2b2a8: 10 '\n'  
(gdb) print mData[637]  
$18 = (const char &) @0xb2b2a9: 32 ' '  
(gdb) print mData[638]  
$19 = (const char &) @0xb2b2aa: 32 ' '  
(gdb) print mData[639]  
$20 = (const char &) @0xb2b2ab: 60 '<'  

调用 find_first_of 的结果是 639,但我得到了 4294967295(在有符号的 32 位 int 中为 -1,与 std::string::npos 匹配)。有人可以证明这种行为是正当的吗?或者告诉我如何解决这个问题?

【问题讨论】:

  • 你能找到一个较短的字符串来产生这种行为吗?并发布它,连同最少和完整的代码?就目前而言,我无法重现该错误。
  • 我敢打赌,错误出现在您未显示的代码中。复制错误的最小、完整、可编译的示例会有所帮助。
  • 顺便说一句,如果您正在寻找单个字符,您可以直接说findfind_first_of 用于查找给定字符集合的任何。没有区别,但我想它更容易阅读和推理。
  • @Charlie - 顺便说一句,如果您正在寻找单个字符,find 函数将是比 find_first_of 更明显的候选者。
  • @Charlie:第 142 行是什么?根据您的 gdb 输出,ltpos 在第 141 行是 636,然后在第 143 行是 -1。第 142 行有代码吗?第 141 行是循环还是其他构造?

标签: c++ gcc cygwin stdstring findfirst


【解决方案1】:

所以 mData 被声明为引用?如果是这样,它并不真正包含内容,它包含对内容的引用。在您调用 find_first_of 时,mData 所指的对象是否仍然存在?

【讨论】:

  • 是的,mData 在类中被声明为 const std::string &。此成员的值在构造函数中设置。此引用指向在此应用程序的 main 方法中声明为本地变量的 std::string,该变量保存 XML 内容。该应用程序仅使用一个线程,因此在解析过程中,没有机会更改 XML 内容(因为在解析器内部 mData 被声明为 const)。此外,如您所见,gdb 显示数据仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2012-02-04
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多