【发布时间】: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 匹配)。有人可以证明这种行为是正当的吗?或者告诉我如何解决这个问题?
【问题讨论】:
-
你能找到一个较短的字符串来产生这种行为吗?并发布它,连同最少和完整的代码?就目前而言,我无法重现该错误。
-
我敢打赌,错误出现在您未显示的代码中。复制错误的最小、完整、可编译的示例会有所帮助。
-
顺便说一句,如果您正在寻找单个字符,您可以直接说
find。find_first_of用于查找给定字符集合的任何。没有区别,但我想它更容易阅读和推理。 -
@Charlie - 顺便说一句,如果您正在寻找单个字符,
find函数将是比find_first_of更明显的候选者。 -
@Charlie:第 142 行是什么?根据您的 gdb 输出,
ltpos在第 141 行是 636,然后在第 143 行是 -1。第 142 行有代码吗?第 141 行是循环还是其他构造?
标签: c++ gcc cygwin stdstring findfirst