我正试图找到链表的下一部分,即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
(cur
是NULL
),它将停止,因为如果第一个条件不是true
, &&
运算符将停止。因此,如果cur
是NULL
,它将停止对条件求值,而不尝试解引用