Arrays 为什么我的代码对数组的某些行有效,而对其他行无效?

Arrays 为什么我的代码对数组的某些行有效,而对其他行无效?,arrays,c,for-loop,Arrays,C,For Loop,因此,对于我的大学实践工作(教授现在没有回答),我必须用C编写一个程序,从用户那里接收一个2D数组,然后在其中搜索3个或更多零的序列。 例: 应输出: no sequence in: 1 no sequence in: 2 Sequence found in: 3 row no sequence in: 4 Sequence found in: 5 row 我编写了这些简单的循环,但我得到了一些奇怪的输出,这些输出并没有导致我得到修复,我的代码是: int main() { int a

因此,对于我的大学实践工作(教授现在没有回答),我必须用C编写一个程序,从用户那里接收一个2D数组,然后在其中搜索3个或更多零的序列。 例:

应输出:

no sequence in: 1
no sequence in: 2
Sequence found in: 3 row
no sequence in: 4
Sequence found in: 5 row
我编写了这些简单的循环,但我得到了一些奇怪的输出,这些输出并没有导致我得到修复,我的代码是:

int main() {
    int array[ROW][COLUMN];
    printf("please enter a 5x5 matrix: \n");
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {
            scanf("%d", &array[i][j]);
        }

    }
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }


    int zero_c = 0;
    for (int i = 0; i < ROW; ++i) {
        for (int j = 0; j < COLUMN; ++j) {

                if (array[i][j] == 0) {
                zero_c = 1;
                if (array[i][j+1] == 0) {
                    zero_c = 1;
                    if (array[i][j + 2] == 0) {
                        zero_c = 1;
                    }
                }
            }else {
                    zero_c = 0;
                }
        }


        if (zero_c==1) {
            printf("Sequence found at: %d row\n ", i + 1);
            zero_c = 0;
        } else {
            printf("no sequence in: %d\n", i + 1);
        }
    }


        return 0;

}

有没有想过为什么会发生这种情况?

代码有两个问题:

  • 它将索引超过行的末尾,导致错误匹配(以及可能的未定义行为)

  • 一旦它在一行中找到一个由3个零组成的序列,它不会停止在该行中查找,因此,如果该行在零之后包含一个1,它就会忘记曾经看到过零,从而导致丢失匹配

  • 通过将内部回路的回路测试更改为:

    for (int j = 0; j < COLUMN - 2; ++j) {
    
    这应该可以修复bug(前提是它继续像现在一样在外循环结束时重置
    zero_c

    更简单的版本如下:

        for (int i = 0; i < ROW; ++i) {
            int zero_c = 0;
            for (int j = 0; j < COLUMN - 2; ++j) {
                if (array[i][j] == 0 && array[i][j+1] == 0 && array[i][j+2] == 0) {
                    zero_c = 1;
                    break;
                }
            }
            ...
    
    

    对于这个版本,当打印一行的状态时,您可以查看
    zero\u c==3
    (同样,不需要在那里重置它)。

    非常感谢,您的解释非常清楚@豪尔赫·维拉巴尔马塞达没问题!如果这回答了您的问题,您应该将答案标记为已接受。呜呜!,我没注意到
    for (int j = 0; j < COLUMN - 2; ++j) {
    
        int zero_c = 0;
        for (int i = 0; i < ROW; ++i) {
            for (int j = 0; j < COLUMN - 2; ++j) {
                if (array[i][j] == 0) {
                    zero_c = 1;
                    if (array[i][j+1] == 0) {
                        zero_c = 1;
                        if (array[i][j + 2] == 0) {
                            zero_c = 1;
                            break;
                        }
                    }
                } else {
                    zero_c = 0;
                }
            }
            ...
    
    
        for (int i = 0; i < ROW; ++i) {
            int zero_c = 0;
            for (int j = 0; j < COLUMN - 2; ++j) {
                if (array[i][j] == 0 && array[i][j+1] == 0 && array[i][j+2] == 0) {
                    zero_c = 1;
                    break;
                }
            }
            ...
    
    
        for (int i = 0; i < ROW; ++i) {
            int zero_c = 0;
            for (int j = 0; j < COLUMN; ++j) {
                if (array[i][j] == 0) {
                    zero_c++;
                    if (zero_c == 3)
                        break;
                }
                else {
                    zero_c = 0;
                }
            }
            ...