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

标签 c arrays loops

我有一个 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,当然你必须将 ij 的声明从循环中拉出来。)

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

关于C:嵌套循环和数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642819/

相关文章:

javascript - 从一张谷歌工作表中获取值,将其输入到另一张带有 4 个循环的工作表上

C编程: Sorting a integer file while keeping their original place in file

arrays - Elasticsearch 的 script_field 为 array.values 返回了错误的值

C系统调用,删除文件

c - 关于 `size_t`和它们测量的指针类型

android - JSON Android 解析JSONArray

c - 对用户输入进行错误处理,直到输入正确

R散点图循环使用两个变量

java - JNI 将字符串从 C 传递到 java

c++ - GCC - 包含编译标志的宏