将2d数组的行复制到1d数组

时间:2014-01-05 17:04:00

标签: c arrays

如何将2d数组的行复制到1d数组?

在我做完之前我确信这样做:

  int x,y;
  scanf("%d%d", &x,&y);   
  int one[x];
  int two[y][x]; 
  one=two[0];

但现在它给了我错误:

  分配

中不兼容的类型

修改

好的,我的坏。 我忘了我不能以这种方式复制数组,但我可以传递单行的2d数组作为参数。解决。

5 个答案:

答案 0 :(得分:3)

你做不到

one=two[0]; // Illegal assignment in C 

数组名称是不可修改的l值。它不能是赋值运算符=的左操作数。你可以这样做

one[x] = two[y][x];

答案 1 :(得分:3)

您正尝试从二维数组分配到一维数组!您将必须循环遍历2-d数组并选择每个单独的值并插入到1-d数组中。

答案 2 :(得分:1)

只需使用此代码:

    int col,rowToCopy=0;
    for(col=0;col<x;col++){
       one[col]=two[rowToCopy][col];
}

答案 3 :(得分:0)

似乎不被接受(我不完全确定 - 我会看起来更好)。

该语言的语义是,对于一维数组,数组的名称是指向数组元素类型的指针,而指向第一个元素的指针。 在您的情况下,数组只是一个类型为(int *)的指针。

在任何(int *)上我们可以应用[]括号。 我检查过的这些括号只是翻译,将方括号内的数字添加到指针(使用指针算术)并对指针应用解除引用。 换句话说:

int *p; 
p[nn] is equivalent to *(p+nn);

所以在那个有下面代码的愿景中:

int a[8],b[8];
a=b;

执行a = b只能将指针b的内容复制到指针a。 但是因为数组是一个常量指针,没有可能改变,这是不可能的。 所以上面的代码会报告错误; 如果有可能,它会将数组b开始的地址复制到指针a。 而且任何方式都不是你需要的或你期望的。

这就是C处理数组的方式(感谢我不得不考虑它)。

如果尺寸固定,我会这样做:

typedef struct{int arr[0x4];}S;
S a,b;
a=b;

要访问数组,您应该使用:a.arr []和b.arr []

如果你需要一个数组数组,扩展到你的情况就很简单了。

问题是在你的情况下,大小是动态的。

唯一简单的解决方案是使用:

memcpy(a,b,sizeof(a));

具有根据需要将b复制到a的效果。其他所有解决方案都比较复杂。

答案 4 :(得分:0)

以下代码可以解决您的问题:

#include<iostream>
#include<string.h>

using namespace std;

int main()
{
  int i,row,col,col1;
  char value1[10][4]={};
  char *value2;
  value2 = new char[40];

  /** Creating a 2D char array ***/
  for(i=0;i<8;i++)
  {
    strcpy(value1[i],"MK,");
  }
  value1[7][strlen(value1[7])-1]='\0';

  /*** Printing the 2D array ****/
  for(i=0;i<8;i++)
  {
    cout<<"\n\n value1[i]="<<value1[i];
  }

  /*** assigning the 2D array value1[][] to string value2 **/
  col1=0;
  for(row=0;value1[row][0]!='\0';row++)
  {
    for(col=0;value1[row][col]!='\0';col++)
    {
      *(value2+col1) = value1[row][col];
      col1++;
    }
  }
  *(value2+col1)='\0';
  /** assignment done ***/

  cout<<"\n\nSize of rows="<<row<<"\n\nSize of Column="<<col;
  cout<<"\n\nvalue1="<<value1[0];
  cout<<"\n\nValue2="<<value2;
  return 0;
}