我有一个int数组,以我在代码中的其他地方创建的'\ 0'结尾。我知道它已经终止,因为我已经测试了它。
说,对于这个例子,数组是[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'没有增加(但我们可以看到它是)或者节点[0] =='\ 0'我们知道这是不正确的,因为循环' j'工作正常。
那么,任何想法是怎么回事?
P.S。当我将while更改为for循环时,它可以正常工作,但前提是我知道'nodes'的长度
答案 0 :(得分:4)
在内循环后,您不会重置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'
是char
- 值为0的字面值,因此您可以更好地说出0
。而不是if (x != 0)
,你可以说if (x)
,这就是我在for循环中所做的。
答案 1 :(得分:1)
您没有在j
循环开头重置j
的值。这样,在第一个循环之后,对于所有后续循环,nodes[j]
为'\0'
,立即中止j
循环。