不知道为什么,当输入的字符串s长度为奇数时(也就是change内部循环奇数次时),数组a在change内时仍有值,可以正常输出,但是当程序运行完函数change后主函数内的a却又没有值了,输出很大的负值,但是我并没有用delete[] 释放。
而且当s长度为偶数时,这个情况又没有了,主函数中a仍保留了函数change内的值,可以正常输出。请帮忙解答!
ps: 问题应该是出在change函数内,函数change1~4可以不用认真看就是把a按规则转到temp
//将二维数组按要求进行旋转变换
#include<iostream>
#include<string>
using namespace std;
//将输入数组的数按变化后的顺序存入新的数组得到变换后的情况
int m, n, i, j ;
void change1(int a[][100], int temp[][100])//顺时针九十度:列从右往左,行从上往下
{
int k = 0, l = 0;
//行与列数量转换(顺时针转九十度,长宽会调换)
int t = m;
m = n;
n = t;
//顺时针九十度转换
for (j = n - 1; j >= 0; j--)
{
for (i = 0; i < m; i++)
{
temp[i][j] = a[k][l];//转换后的数组行数列数变化规则与转换前不一致,所以设置k,l来控制转换前数组元素的读取
l++;
if (l == m)//列数累加到上限则归零且行数++
{
k++;
l = 0;
}
}
}
}
void change2(int a[][100], int temp[][100])//逆时针九十度:列从左往右,行从下往上
{
int k = 0, l = 0;
//行与列数量转换
int t = m;
m = n;
n = t;
//逆时针九十度转换
for (j = 0; j < n; j++)
{
for (i = m - 1; i >= 0; i--)
{
temp[i][j] = a[k][l];
l++;
if (l == m)
{
k++;
l = 0;
}
}
}
}
void change3(int a[][100], int temp[][100])//左右翻转:行从上往下,列从右往左
{
int k = 0, l = 0;
for (i = 0; i < m; i++)
{
for (j = n - 1; j >= 0; j--)
{
temp[i][j] = a[k][l];
l++;
if (l == n)
{
k++;
l = 0;
}
}
}
}
void change4(int a[][100], int temp[][100])//上下翻转:行从下往上,列从左往右
{
int k = 0, l = 0;
for (i = m - 1; i >= 0; i--)
{
for (j = 0; j < n; j++)
{
temp[i][j] = a[k][l];
l++;
if (l == n)
{
k++;
l = 0;
}
}
}
}
//用temp按规则接收a内的元素,完成后,再把a释放掉,然后将a指向temp
void change(int a[][100], string s)
{
char order;
for (int k = 0; k < s.size(); k++)
{
order = s[k];
int(*temp)[100] = new int[100][100];
temp[0][0] = 0;
switch (order)
{
case 'A': change1(a, temp); break;
case 'B': change2(a, temp); break;
case 'C': change3(a, temp); break;
case 'D': change4(a, temp); break;
}
delete[] a;
a = temp;
temp = NULL;
}
//change内部输出
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
cout << a[i][j] << ' ';
}
cout << endl;
}
}
int main()
{
int(*a)[100] = new int[100][100];
cin >> m >> n;//m为行数,n为列数
for(i=0;i<m;i++)
for (j = 0; j < n; j++)
{
cin >> a[i][j];
}
string s;
cin >> s;//控制变换要求的字符串
change(a, s);//变换函数
//主函数输出
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
cout << a[i][j]<<' ';
}
cout << endl;
}
delete[] a;
a = NULL;
return 0;
}