【问题标题】:How to convert 2D char array to 1D char array in c++如何在 C++ 中将 2D char 数组转换为 1D char 数组
【发布时间】:2021-09-12 23:28:51
【问题描述】:

有一个矩阵,那我得做个函数才能知道左对角线和右对角线的值是一样的。

const int n = 100;
int main(){
    int n;
    char a[n][n];
    int dimL = 0;
    int dimR = 0;


    cout << "Input the dimension of the matrix: ";
    cin >> n;

    for( int i = 0; i < n; i++ )
        for( int j = 0; j < n; j++ ){
            cin >> a[i][j];
        }

    cout << "Matrix A is: " << endl;

    for( int i = 0; i < n; i++ )
        for( int j = 0; j < n; j++ ){
            cout << a[i][j] << " ";
            if( j == n - 1 )
                cout << endl;
        }

    check(a,n,dimL,dimR);

    if(check(a,n,dimL,dimR)){
        cout << "YES";
    }
    else {
        cout << "NO";
    }

}

主要是输入数组的简单代码。

bool check(char a[n][n], int n, int &dimL, int &dimR ){
    char left[n][n], right[n][n];

    for( int i = 0; i < n; i++ )
        for( int j = 0; j < n; j++ ){
            if( i == j ){
                left[dimL++] = a[i][j]; // left diagonal
            }
            if( i + j == n - 1 ){
                right[dimR++] = a[i][j]; // right diagonal
            }
        }

    for( int i = 0; i < n; i++ )
        if( left[i] != right[i] )
            return false;
        return true;
        
}

这就是函数。当然是不行的。它说表达式必须是可修改的左值。因为它的一维到二维。我可以将二维数组转换为一维数组吗?

我意识到有些代码是错误的。所以我改变了。

const int x = 100;
bool check(char a[x][x], int n, int &dimL, int &dimR ){
    char left[x], right[x];

    for( int i = 0; i < n; i++ )
        for( int j = 0; j < n; j++ ){
            if( i == j ){
                left[dimL++] = a[i][j];
            }
            if( i + j == n - 1 ){
                right[dimR++] = a[i][j];
            }
        }

    for( int i = 0; i < n; i++ )
        if( left[i] != right[i] )
            return false;
        return true;
        
}

它有效。我尝试输入数组 a a a, b b b, c c c,结果是yes。就是一个简单的小问题没解决,看不到左右数组。

如果我尝试将一些代码放在我的主目录中。

if(int i = 0; i < n; i++ ){
   cout << left[i];
}

这同样表明我需要可修改左值的表达式..

谢谢

【问题讨论】:

  • 这能回答你的问题吗? C++ 2D array to 1D array
  • 不应该char left[n][n], right[n][n];char left[n], right[n];,因为你希望它们是一维的吗?
  • 我试过了。它没有用。对我有什么建议吗?
  • 谢谢帕特里克。但还是不行
  • 在这种情况下,例如我的矩阵是:a b c d e f c b a 左对角线是aea,右对角线是cec。我试图为左对角线创建一个数组作为 left[n]。所以左[0] = a,左[1] = e,左[2] = a,依此类推..

标签: c++ arrays


【解决方案1】:

如果是纯数组,你有两个选项:

for (int i = 0; i < rows; ++i)
    for (int j = 0; j < columns; ++i)
        oneDArr[i * columns + j] = twoDArr[i][j];

但你也可以偷偷摸摸地做;

int singleArraySize = columns * rows;
for (int i = 0; i < singleArraySize; ++i)
    *(oneDArr + i) = *(twoDArr + i);

第二个例子是利用二维数组占据连续空间的事实。换句话说,如果j = 5 我们有10 列,以及i = 3twoDArr[5 * 10 + 3] == twoDArr[53]

编辑: 因此,如果您在计算机内存中有array[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}},它们的存储方式如下:

memory address | array[i][j] | value
---------------+-------------+---------
0x1            | array[0][0] | 1
0x2            | array[0][1] | 2
0x3            | array[0][2] | 3
0x4            | array[1][0] | 4
0x5            | array[1][1] | 5
0x6            | array[1][2] | 6
0x7            | array[2][0] | 7
0x8            | array[2][1] | 8
0x9            | array[2][2] | 9

其中内存地址是存储值的地址。

【讨论】:

  • 行列相同是否有效?
  • 我不明白你的问题,但我会尽量详细说明。
  • 解决了。我对我的问题进行了一些更新.. 只是一点点问题
  • @aprilio 我详细说明了我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2011-06-08
  • 2022-01-18
  • 2022-01-22
相关资源
最近更新 更多