显示2D动态数组

时间:2012-10-19 15:20:02

标签: c++ arrays

对不起,如果这是一个有点愚蠢的问题。

这是我的代码:

#include<iostream>
using namespace std;

int main()
{
  int columns, rows;
  char **map;

  cin>>columns;
  cin>>rows;

  /*creats array of pointers rows tall*/
  map = new char*[rows];

  /*creats array of chars columns tall*/
  for(int i=0; i<rows; i++)
    map[i] = new char[columns];

  //populate map with input
  map[0][0] = cin.get();
  for(int j=0; j<rows; j++)
    for(int i=0; i<columns; i++)
    {
      if (cin.peek() == '\n')
        cin.ignore(256, '\n');
      else
        map[j][i] = cin.get();
    }


  //DISPLAY
  cout<<endl;
  for(int j=0; j<rows; j++)
  {
    for(int i=0; i<columns; i++)
    {
      cout<<map[j][i];
    }
  }
  return 0;
}

用户将输入如下内容:

7 4
#######
#S#   #
#   #E#
#######

我想输出它。然而我的出现就像:

#######
#S#    
##   #
E#####

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

首先进行循环:

  //populate map with input

  for(int j=0; j<rows; j++)
  {
    cin.get();
    for(int i=0; i<columns; i++)
    {
      if (cin.peek() == '\n')
        cin.ignore(256, '\n');
      else
        map[j][i] = cin.get();
    }
  }

并将新行添加到输出中:

  //DISPLAY
  cout<<endl;
  for(int j=0; j<rows; j++)
  {
    for(int i=0; i<columns; i++)
    {
      cout<<map[j][i];
    }
    cout << endl;
  }

在再次阅读之前,请务必确保从输入流中获取尾随输入。

答案 1 :(得分:1)

一些事情

  • 首先,您不需要循环前map[0][0] = cin.get();,因为您将在循环中获得map[0][0]

  • 第二,如果有一个新行,循环会跳过它,但也不会填充该位置的矩阵。 你应该有这样的东西:

for(int j=0; j<rows; j++)
    for(int i=0; i<columns; i++)
    {
      while (cin.peek() == '\n')
        cin.ignore(256, '\n');
      map[j][i] = cin.get();
    }

只要有'\ n'字符就跳过(忽略)。

  • 第三,虽然与你的问题无关。完成后你应该总是释放动态分配的内存(如果你忘记了)

    delete [] map[i]; delete [] map;

答案 2 :(得分:0)

我认为你的输出中需要一些换行符

  for(int j=0; j<rows; j++)
  {
    for(int i=0; i<columns; i++)
    {
      cout<<map[j][i];
    }
    cout << '\n';
  }