【问题标题】:Read and write matrix读写矩阵
【发布时间】:2013-10-24 17:34:22
【问题描述】:

我已经编写了这段代码来获取 r*c 矩阵的输入

r -> 行 c -> 列

当 rc.

时无法产生正确的输出

例子:

r=6, c=2

输入: 1 2 3 4 5 6 7 8 9 10 11 12

输出:

1 2 11 12 5 6 11 12 11 12 11 12

请告诉我哪里出错了。 我不想使用固定大小的数组。

#include <stdio.h>

void scanmatrix(int* a[],int r,int c)
{
int i,j;

for(i=0;i<r;i++)
{
    for(j=0;j<c;j++)
    {
        scanf("%d",&a[i][j]);
    }
}
}

void printmatrix(int* a[],int r,int c)
{
int i,j;

for(i=0;i<r;i++)
{
    printf("\n\n");
    for(j=0;j<c;j++)
    {
        printf("%d\t",a[i][j]);
    }
}
}

int main()
{
int* a;

int r,c,i,j;

scanf("%d%d",&r,&c);

a=(int *)malloc(r*c*sizeof(int));

scanmatrix(&a,r,c);
printmatrix(&a,r,c);

return(0);
}

【问题讨论】:

    标签: c loops pointers


    【解决方案1】:

    使用单指针分配二维数组意味着连续分配内存。所以你不能像a[i][j]这样使用下标,因为你需要正确指向指针

    下面的代码展示了你如何使用单指针来存储二维数组,就像你可以在代码中实现的一样

    #include<stdio.h>
    #define COL 2
    #define ROW 6
    int main()
    {
            int *p,i,j;
            p=(int *)malloc(ROW*COL*sizeof(int ));
             for(i=0;i<ROW;i++)
            {
                    for(j=0;j<COL;j++)
                    {
                            scanf("%d\t",&p[i*COL+j]);
                    }
                    printf("\n");
            }
    
            for(i=0;i<ROW;i++)
            {
                    for(j=0;j<COL;j++)
                    {
                            printf("%d\t",p[i*COL+j]);
                    }
                    printf("\n");
            }
    return 0;
    }
    

    【讨论】:

    • 如果您想使用 2 个下标访问或将元素写入矩阵,例如 a[i][j],那么您可以使用双指针,这样易于使用,例如 p[i][ j]
    【解决方案2】:

    您已分配一维数组,但将其视为二维数组。这是在寻求惊喜:)

    可能的修复:

    #include <stdio.h>
    
    void scanmatrix(int* a,int r,int c)
    {
    int i,j;
    
    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            int k = c*i+j;
            scanf("%d",a+k);
        }
    }
    }
    
    void printmatrix(int* a,int r,int c)
    {
    int i,j;
    
    for(i=0;i<r;i++)
    {
        printf("\n\n");
        for(j=0;j<c;j++)
        {
            int k = c*i+j;
            printf("%d\t",a[k]);
        }
    }
    }
    
    int main()
    {
    int* a;
    
    int r,c,i,j;
    
    scanf("%d%d",&r,&c);
    
    a=(int *)malloc(r*c*sizeof(int));
    
    scanmatrix(&a,r,c);
    printmatrix(&a,r,c);
    
    return(0);
    }
    

    【讨论】:

    • int k = c*(i-1)+j; 应该是 int k = c*i+j; 因为索引 i 从 0 开始,而不是 1。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多