我有一个 int 数组,它以我代码中别处创建的“\0”结尾。我知道它是 null 终止的,因为我已经测试过了。
比如说,对于这个例子,数组是 [7, 8, 9, 11, 12, '\0']
当我将它提供给我的函数时:
int edgesInCluster(Graph *g, int *nodes) {
int count = 0;
int i = 0;
int j = 0;
while(nodes[i] != '\0') {
while(nodes[j] != '\0') {
if(i<j) {
printf("%i %i\n", nodes[i], nodes[j]);
count += isNeighbour(g, nodes[i], nodes[j]);
}
j++;
}
i++;
}
return count;
}
printf 正在输出:
7 7
7 8
7 9
7 11
7 12
什么时候应该输出:
7 8
7 9
7 11
7 12
8 9
8 11
8 12
9 11
9 12
11 12
这意味着由于某种原因 'i' 没有递增(但我们可以看到它是递增的)或者 nodes[0] == '\0' 我们知道这是不正确的,因为循环与 ' j' 工作正常。
那么,有什么想法吗?
附言当我将 whiles 更改为 for 循环时,它会起作用,但前提是我知道“节点”的长度
最佳答案
在内部循环之后,您不会重置您的 j
。
但是为什么要写这么冗长的代码呢?试试这个:
size_t count = 0;
for (size_t i = 0; nodes[i]; ++i)
{
for (size_t j = i + 1; nodes[j]; ++j)
{
printf("%i %i\n", nodes[i], nodes[j]);
count += isNeighbour(g, nodes[i], nodes[j]);
}
}
return count;
(如果你想要严格的 ANSI C89,当然你必须将 i
和 j
的声明从循环中拉出来。)
另请注意,'\0'
是一个值为 0 的 char
字面量,因此您也可以更准确地说是 0
。而不是 if (x != 0)
你可以只说 if (x)
,这就是我在 for 循环中所做的。
关于C:嵌套循环和数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642819/