C -链表/libxml -搜索下一个元素的特定类型和检查列表的结束



我正试图找到链表的下一部分,即XML_ELEMENT_NODE,并在找到时停止,或者我到达列表的末尾:

do
{
    cur = cur->next;
} while (cur->type != XML_ELEMENT_NODE && cur != NULL);

所以我先得到next,因为如果我先检查,我将被困在相同的部分,不会进展。问题是当我到达最后的cur == NULL时,我不能检查类型,因为我在NULL,不能明显地得到类型。是否有一个优雅的解决方案,因为所有我能想到的需要替换变量,我设置在循环中,所以我可以检查它们在while()。我认为break不是一个选项。

您应该遵循一定的迭代流程。一般来说,您必须永远不能解引用空指针,因此您必须始终确保curr不是空指针(简要地说:curr != NULL)。

如果出于任何原因,您需要先获取下一个元素,您应该使用:

while ( curr != NULL ) {
    curr = curr->next;
    if ( (curr != NULL) && (curr->type == XML_ELEMENT_NODE) )
        break;
}

但是更好的方法是总是在当前节点上操作(这就是为什么这样调用指针)。如果知道 curr不是NULL(由前面的代码确定),则可以使用:

// from some previous code, you have:
curr = curr->next;
... (do something unrelated, i.e. do not dereference curr if null-pointer)
while ( (curr != NULL) && (curr->type != XML_ELEMENT_NODE) ) {
    curr = curr->next;
}

在任何循环之后,您必须在解引用curr之前测试curr != NULL以捕获列表结束条件。

请注意,curr始终是当前节点(您开始/工作的节点)

您没有首先检查cur是否良好。我建议

while (cur != NULL) {
    if (cur->type == XML_ELEMENT_NODE)
        break;
    cur = cur->next;
}
if (cur != NULL) {
// ... success
}

EDIT既然OP说他已经检查了cur,也不喜欢break,这是我的修订,但这个仍然在开始时检查cur而不是循环结束。

while (cur != NULL && cur->type != XML_ELEMENT_NODE)
    cur = cur->next;
}
if (cur != NULL) {
// ... success
}

try this:

while(cur->next !=NULL && cur->next->type != XML_ELEMENT_NODE) {
    cur = cur->next;
}
// at this point, the next element, if it exists, is of type XML_ELEMENT_NODE
// if it doesn't exist, cur->next will be NULL
cur = cur->next;

交换&&运算符周围的条件:

do
{
    cur = cur->next;
} while (cur != NULL && cur->type != XML_ELEMENT_NODE);

这是因为如果第一个条件是false (curNULL),它将停止,因为如果第一个条件不是true, &&运算符将停止。因此,如果curNULL,它将停止对条件求值,而不尝试解引用

指针。

相关内容

  • 没有找到相关文章

最新更新