C:嵌套循环和数组的奇怪行为

时间:2011-07-10 17:56:16

标签: c arrays loops

我有一个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'的长度

2 个答案:

答案 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,你必须从循环中提取ij的声明。)

另请注意,'\0'char - 值为0的字面值,因此您可以更好地说出0。而不是if (x != 0),你可以说if (x),这就是我在for循环中所做的。

答案 1 :(得分:1)

您没有在j循环开头重置j的值。这样,在第一个循环之后,对于所有后续循环,nodes[j]'\0',立即中止j循环。