【问题标题】:C: odd behaviour with nested loop and arrayC:嵌套循环和数组的奇怪行为
【发布时间】:2011-07-10 17:56:15
【问题描述】:

我有一个 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' 工作正常。

那么,有什么想法吗?

附:当我将 while 更改为 for 循环时,它可以工作,但前提是我知道“节点”的长度

【问题讨论】:

    标签: c arrays loops


    【解决方案1】:

    您不会在内部循环之后重置您的 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' 是一个值为0 的char-literal,所以你也可以说0。而不是if (x != 0),你可以直接说if (x),这就是我在for循环中所做的。

    【讨论】:

    • 啊,我真傻!我写冗长,直到我知道一切正常,然后我可以在必要时减少它。对于它的价值,我用 -Wall 和 -pedantic 编译为 c99 并且我没有收到任何警告 - 似乎比不那么冗长更重要。感谢您的帮助。
    • @Griffin:但您的冗长实际上模糊了逻辑。 for 循环非常适合表达范围循环的语义,因此通过“手动执行”,您所做的一切只会让您自己感到困惑……另外请注意,我的循环通过从正确的值开始而不是必须做更有效if (i &lt; j) 每次检查。
    • 点了,谢谢。只是出于兴趣,为什么用 size_t 而不是 int?
    • @Griffin:数组索引和计数的自然数据类型是size_t。它是sizeof 运算符的返回类型,通常类型定义为unsigned int。由于您的值是无符号整数,因此最好使用最合适的数据类型。
    • @Kerrek SB(抱歉没有意识到这是礼仪)。注意到未签名的整数,再次感谢您。
    【解决方案2】:

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

    【讨论】:

    • 干杯,Kerrek SB 刚刚把你拉到了岗位!
    • 是的,反正他的提议更好。
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多