0

r*c 行列の入力を取得するためにこのコードを書きました

r -> 行 c -> 列

r<=c の場合は問題なく動作しますが、r>c の場合は正しい出力を生成できません。

例:

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);
}
4

2 に答える 2

0

単一のポインターを使用して 2 次元配列を割り当てることは、メモリを連続的に割り当てることを意味します。したがって、a[i][j] のような添え字を使用することはできません。そのためには、ポインターを正しく指す必要があります。

以下のコードは、単一のポインターを使用して 2D 配列を格納する方法を示しています。これは、コードに実装できるものと同じです。

#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;
}
于 2013-10-24T17:56:16.380 に答える
0

1 次元配列を割り当てましたが、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);
}
于 2013-10-24T17:51:04.590 に答える