繁体   English   中英

奇怪的问题 - c 中的维数组输入

[英]Weird issue - dimensional array input in c

我编写了一个程序来检查方形n*n矩阵是否“完美”,这意味着每一行和每一行都包含从 1 到n的每个数字的一​​个实例。

我还编写了一个 main 函数来为给定大小分配内存并从用户那里接收该矩阵的值。

它似乎工作正常,除非我选择 4 作为大小并输入此矩阵: {{1,2,3,4},{2,1,4,3},{3,4,2,1),{4,3,1,2}}

我得到矩阵{{1,2,3,4},{2,**3**,4,3},{3,4,**3**,1},{4,3,1,2}}

它看起来像一个输入的东西,但我t find what错了:(

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int IsPerfect(int *arr, int size);

void main() {
    int size = 0, i = 0, j = 0, vol = 0;
    printf("please enter matrix size, 0 to exit:\n");
    scanf("%d", &size);
    printf("size is :%d\n", size);
    while (size != 0) {  //loop for allocating and inputing ,matrix
        int *pmatrix = (int *)malloc(size*size * sizeof(int));
        printf("please input matrix:\n");
        for (i = 0; i < size; i++)
            for (j = 0; j < size; j++) {
                printf("[%d][%d]\n", i, j);
                scanf("%d", ((pmatrix + i) + j));  //storing matrix values
            }
        for (i = 0; i < size; i++) {
            for (j = 0; j < size; j++)
                printf("[%d]", *((pmatrix + i) + j));  //printing matrix
            printf("\n");
        }
        IsPerfect(pmatrix, size);  //perfect check
        free(pmatrix);
        printf("please enter matrix size, 0 to exit:\n");
        scanf("%d", &size);
    }
    printf("bye bye!\n");
}

int IsPerfect(int *arr, int size) {
    int i = 0, j = 0, w = 0, perf = 1;
    int *check = (int *)malloc(sizeof(int) * size);

    for (w = 0; w < size; w++) {  //horizontal check
        for (i = 0; i < size; i++)
            *(check + i) = 0;
        for (i = 0; i < size; i++)
            for (j = 1; j <= size; j++)
                if (*((arr + w) + i) == j)
                    *(check + j - 1) = *(check + j - 1) + 1;
        for (i = 0; i < size; i++)
            if (*(check + i) == 0 || *(check + i) > 1)
                perf = 0;
    }
    for (w = 0; w < size; w++) {  //vertical check
        for (i = 0; i < size; i++)
            *(check + i) = 0;
        for (i = 0; i < size; i++)
            for (j = 1; j <= size; j++)
                if (*((arr + i) + w) == j)
                    *(check + j - 1) = *(check + j - 1) + 1;
        for (i = 0; i < size; i++)
            if (*(check + i) == 0 || *(check + i) > 1)
                perf = 0;
    }


    if (perf == 1)
        printf("the matrix is perfect\n");
    if (perf == 0)
        printf("the matrix is not perfect\n");
    free(check);
    return perf;
}

以下建议代码:

  1. 干净地编译
  2. 使用适当的水平和垂直间距以提高可读性
  3. 正确检查(并处理)错误
  4. 使用size_t作为索引类型,因为这些值永远不应该小于 0 并且更好地匹配malloc()函数的期望
  5. 使用如下语句: for ( size_t col = 1; col <= size; col++ )将局部变量的scope限制为封闭的for()循环体
  6. 纠正输入序列的问题,其中访问矩阵元素的方法不正确
  7. 没有纠正check()函数中的问题,同样,访问矩阵元素的方法不正确
  8. check()函数中的问题是数组元素的寻址
  9. 重命名变量ij以便更好地理解。 i ==> rowj ==> col

注意:这个语句是代码中的典型问题:

if ( *(check + row) == 0 || *(check + row) > 1 )

因为check是在[0] [0],从而当添加row ,其跨所述第一行IE [0] [0] ...索引[0] [3]。 不是代码需要做什么来检查矩阵的列

也许你的意思是:

if ( *(check + size*row + col) == 0 || *(check + size*row + col) > 1 )

这将索引 [0][col]... [3][col]

现在,建议的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


int IsPerfect( int *arr, size_t size );

int main( void ) 
{
    size_t size;

    printf("please enter matrix size, 0 to exit:\n");
    scanf("%zu", &size);
    printf("size is :%zu\n", size);

    while ( size != 0 ) 
    {  //loop for allocating and inputing ,matrix
        int *pmatrix = malloc( size*size * sizeof(int) );
        if( ! pmatrix )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }

        printf( "please input matrix:\n" );

        for ( size_t row = 0; row < size; row++)
        {
            for ( size_t col = 0; col < size; col++) 
            {
                printf( "[%zu][%zu]\n", row, col );
                if( scanf( "%d", &pmatrix[ (size*row) + col ]) != 1 )  //storing matrix values row by row
                {
                    fprintf( stderr, "scanf for matrix entry failed\n" );
                    free( pmatrix );
                    exit( EXIT_FAILURE );
                }
            }
        }

        for ( size_t row = 0; row < size; row++) 
        {
            for ( size_t col = 0; col < size; col++)
            {
                printf( "[%d]", pmatrix[ row*size + col ] );  //printing matrix
            }
            printf( "\n" );
        }

        IsPerfect( pmatrix, size );  //perfect check
        free( pmatrix );

        printf( "please enter matrix size, 0 to exit:\n" );
        scanf( "%zu", &size );
    }
    printf( "bye bye!\n" );
}


int IsPerfect( int *arr, size_t size ) 
{
    int  perf = 1;

    int *check = malloc( sizeof(int) * size );
    if( !check )
    {
        perror( "malloc failed" );
        exit( EXIT_FAILURE );
    }

    for ( size_t w = 0; w < size; w++ ) 
    {  //horizontal check
        for ( size_t row = 0; row < size; row++ )
        {
            *(check + row) = 0;
        }

        for ( size_t row = 0; row < size; row++ )
        {
            for ( size_t col = 1; col <= size; col++ )
            {
                if ( *((arr + w) + row) == (int)col )
                {
                    *(check + col - 1) = *(check + col - 1) + 1;
                }
            }
        }

        for ( size_t row = 0; row < size; row++ )
        {
            if ( *(check + size*row) == 0 || *(check + size*row) > 1 )
            {
                perf = 0;
            }
        }
    }

    for ( size_t w = 0; w < size; w++ ) 
    {  //vertical check
        for ( size_t row = 0; row < size; row++ )
        {
            *(check + size*row) = 0;
        }

        for ( size_t w = 0; w < size; w++ )
        {
            for ( size_t col = 1; col <= size; col++ )
            {
                 // why expect a position reference in the matrix to be the same as the content
                if ( *((arr + size*col) + w) == (int)col )      
                {
                    *(check + col - 1) = *(check + col - 1) + 1; //  causes seg fault
                }
            }
        }

        for ( size_t row = 0; row < size; row++ )
        {
            if ( *(check + row) == 0 || *(check + row) > 1 )
            {
                perf = 0;
            }
        }
    }


    if (perf == 1)
    {
        printf( "the matrix is perfect\n" );
    }

    else
    {
        printf( "the matrix is not perfect\n" );
    }

    free( check );
    return perf;
}

注意:运行建议的代码并使用 OPs 数据,结果:

[1][2][3][4]
[2][1][4][3]
[3][4][2][1]
[4][3][1][2]

所以输入操作现在是正确的,但check()函数仍然很远(并导致(大约)第 109 行上的段错误事件:

if ( *((arr + size*col) + w) == (int)col ) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM