如何使用3D char数组调整双指针2D char阵列的大小
How can I resize a double pointer 2D char array by using a 3D char array?
我不确定如何从char ***调整char ** 2d数组的大小。char ** 2D数组通过此调整大小函数如下所示。
这里说功能:
resize_canvas(&C, 5, 6, 5, 10, 'e');
这通过以下代码。它正在打印出一个char ***,但不是我想要的大小。它必须能够从上述功能中调整到任何给定的大小:
void resize_canvas(char*** Cp, int old_width, int old_height, int new_width, int new_height, char wc){
int height = new_height;
int width = new_width;
int depth = 1;
Cp = new char**[height];
for(int i = 0; i < height; i++){
Cp[i] = new char*[width];
for(int j = 0; j < width; j++){
Cp[i][j] = new char[depth];
for(int z = 0; z < depth; ++z){
Cp[i][j][z] = wc;
cout << Cp[i][j][z];
}
}
cout << endl;
}
}
它没有给我我想要的东西。以前的char **阵列打印出来:
// C:
// ddddddd
// ddddddd
// ddddddd
// ddddddd
// ddddddd
// ddddddd
我需要它可以调整大小,以便以后:
// C:
// ddddddeeee
// ddddddeeee
// ddddddeeee
// ddddddeeee
// ddddddeeee
这些是我以前分配和填充Char ** 2D数组的功能:
char** allocate_canvas(int width, int height){
char **array;
char temp = 'A';
array = (char **)malloc(height* sizeof(char *));
for (int i = 0; i < height; i++){
array[i] = (char*)malloc(width* sizeof(char));
}
return array;
}
void wash_canvas(char** C, int width, int height, char wc){
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
C [j][i] = wc;
}
}
}
void deallocate_canvas(char** C, int width){
for(int i = 0; i < width; i++){
free(C[i]);
C[i] = NULL;
}
free(C);
}
由于您使用的是C ,因此可以将引用传递给指针。这是实现resize_canvas
的一种方法。
void resize_canvas(char**& Cp,
int old_width, int old_height,
int new_width, int new_height, char wc)
{
int height = new_height;
int width = new_width;
int depth = 1;
// Allocate memory for the new array.
char** newArray = new char*[height];
for(int i = 0; i < height; i++)
{
newArray[i] = new char[width];
for(int j = 0; j < width; j++){
newArray[i][j] = wc;
}
}
// Deallocate the old array.
char** oldArray = Cp;
for(int i = 0; i < old_height; i++)
{
delete [] oldArray[i];
}
delete [] oldArray;
// Return the new array to the calling function.
Cp = newArray;
}
话虽如此,最好使用代表Canvas
的类。
class Canvas
{
public:
Canvas(int width, int height, char wc);
void wash(char wc);
void resize(int new_width, int new_height, char wc);
private:
// Private data can take different forms.
// Best to use std::vector.
std::vector<std::vector<char>> data;
};
我认为您的问题源于:
Cp = new char**[height];
就像按值通过值传递的任何参数一样,更新它将影响本地值,但不会返回您更改的内容。实际上,您采取了您所做的工作,然后从之前的2D字符阵列中拨出并将其扔掉,用新的 local 2D char数组代替它。您需要分配给由参数指向的内存,或:
*Cp = new char*[height];
,因为您已经有必要的功能可以使用,因此将它们重新授权。
//assuming that resize means (new_width > old_width) and (new_height > old_height)
void resize_canvas(char*** Cp, int old_width, int old_height, int new_width, int new_height, char wc)
{
//char*** Cp : here Cp is address of existing 2D array.
//[1] Allocate the new array
char **C_new = allocate_canvas(new_width, new_height);
//[2] if the (new_width > old_width) and (new_height > old_height) then fill old elements with corresponding 'Cp[i][j]' and all the extra elements with 'wc'.
int i, j;
char **C_old = *Cp; // now 'C_old' will point to you existing 2D array.
//filling old elements
for(i = 0; i < old_height; ++i)
{
for(j = 0; j < old_width; ++j)
{
C_new[i][j] = C_old[i][j];
}
}
//[3] Deallocate the existing array
deallocate_canvas(C_old, old_width);
//[4] assign new array to old array
*Cp = C_new;
//filling new elements
for(; i < new_height; ++i)
{
for(; j < new_width; ++j)
{
C_new[i][j]= wc;
}
cout << endl;
}
//check the array by printing
cout << endl;
for(i = 0; i < new_height; ++i)
{
for(j = 0; j < new_width; ++j)
{
cout << C_new[i][j];
}
cout << endl;
}
}
相关文章:
- Arduino(C )condenate char*阵列与float数组
- char,const char*阵列问题,用于mqtt client.publish
- 为什么Xor-ing两个“ char”阵列显示垃圾位
- 从char阵列中提取十六进制数字
- 我如何使我的循环转到char*阵列的尽头,并将每个城市都放在链接的列表中(城市被划分为白色的空间)
- CIN正在为char阵列工作,但不为int阵列工作
- 为什么在使用SizeOf进行同一char阵列时会得到各种结果
- 如何打印char阵列的地址
- 如何将char阵列的中间单词更改为向后
- 我如何格式化十六进制中“未签名char”阵列的值
- 创建char阵列时,其长度与所需的长度不同
- C 2D char阵列有时会在随机位置复制数据
- 如何创建一个构造函数,该构造函数吸收char阵列
- Char阵列中的特定索引的C 拉动签名整数
- 在C 中乘以两个char阵列
- 无效的char阵列分配
- 如何使用3D char数组调整双指针2D char阵列的大小
- 为什么这两个char阵列不相等
- 使用Strcat的2个char阵列的串联
- Qthread char阵列在两个线程之间传递后被摧毁