C-在函数之间移动2D数组
基本上,我现在正在学习函数和指针。我知道我不能直接从函数返回数组,而是需要使用指针 从下面的代码中可以看出,我正在使用函数char*generate\u 2D\u array来创建一个二维数组。然后,我正在寻找一种方法,可以让这个数组在我的函数Menu中工作。此时,我的总体目标是能够打印2D阵列 当我生成2D数组并从同一方法中打印它时,效果很好。我得到一个12 x 12的点网格。然而,使用我的代码,我得到了一个12 x 12的随机字符和空格网格。请帮我把这个修好 电流输出为 这是我的密码:C-在函数之间移动2D数组,c,C,基本上,我现在正在学习函数和指针。我知道我不能直接从函数返回数组,而是需要使用指针 从下面的代码中可以看出,我正在使用函数char*generate\u 2D\u array来创建一个二维数组。然后,我正在寻找一种方法,可以让这个数组在我的函数Menu中工作。此时,我的总体目标是能够打印2D阵列 当我生成2D数组并从同一方法中打印它时,效果很好。我得到一个12 x 12的点网格。然而,使用我的代码,我得到了一个12 x 12的随机字符和空格网格。请帮我把这个修好 电流输出为 这是我的密码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int rand_num_gen( )
{
srand(time(NULL));
int randNum;
randNum = (rand() % 12);
printf("%d", randNum);
return randNum;
}
char rand_char_gen( )
{
char randChar = ' ';
int randNum = 0;
randNum = 26 * (rand() / (RAND_MAX + 1.0));
randNum = randNum + 97;
randChar = (char) randNum;
return randChar;
}
char * generate_2D_array( )
{
srand(time(NULL));
char grid[12][12];
char *p;
p = *grid;
int i, j;
for (i = 0;i < 12; i++)
{
for (j = 0; j < 12; j++)
{
grid[i][j] = '.'; //rand_char_gen( );
}
}
return grid;
}
void print_array(char * array)
{
int i, j;
for (i = 0; i < 12; i++)
{
for (j = 0; j < 12; j++)
{
printf("%c ", *array++);
}
printf("\n\n");
}
}
Menu()
{
char *myArray;
myArray = generate_2D_array( );
print_array(myArray);
printf("\nChoose a catagory: ");
printf("\nPleease select your number of choice...");
printf("\n1. Animals");
printf("\n2. Colors");
printf("\n3. Planets");
printf("\n4. Weekdays");
int valid = 0;
while(valid == 0)
{
printf("\n\nYour selection: ");
int catagory;
scanf("%d", &catagory);
if(catagory == 1)
{
printf("\n\nPlaceholder\n");
char word1[] = "dog";
int length = sizeof(myArray);
printf("myArray = %d", length);
valid++;
}
else if(catagory == 2)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory == 3)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory == 4)
{
printf("\n\nPlaceholder\n");
valid++;
}
else if(catagory > 4)
{
printf("\n\nInvalid input. Please select again.\n");
}
else if(catagory < 1)
{
printf("\n\nInvalid input. Please select again.\n");
}
}
}
编辑:
好吧,我解决了这个问题。我所需要做的就是将名为Grid的数组设置为静态数组: 局部变量就是它们所定义的函数的局部变量。这意味着当函数返回时,变量不再存在。返回并使用指向此类局部且不存在的变量的指针会导致错误 基本上有两种解决方案:要么在调用函数中创建数组,并将指向该数组的指针作为参数传递;或者在堆外动态分配数组并返回该指针 只是一个简单的示例,与您的代码无关,只是为了向您展示以下原则:
void initialize_array_of_arrays(char (*arr)[],
const size_t num_lines,
const size_t num_cols)
{
for (size_t line = 0; line < num_lines; ++line)
{
for (size_t col = 0; col < num_cols - 1; ++col)
{
arr[line][col] = 'A' + line;
}
arr[line][num_cols - 1] = '\0'; // Terminate as string
}
}
int main(void)
{
char arr[12][5];
initialize_array_of_arrays(arr, 12, 5);
for (size_t i = 0; i < 12; ++i)
printf("Line %d: %s\n", i, arr[i]);
}
预期产出:
AAAA
BBBB
CCCC
DDDD
EEEE
FFFF
GGGG
HHHH
IIII
JJJJ
KKKK
LLLL
局部变量在其作用域的末尾被销毁。除了作用域问题,如果它是2D数组,是什么让你认为char*对于我们来说是一个字符数组,但如果你咨询语言laywer是一种表示它的好方法,这在技术上是不正确的?@John3136是的,只要你一直跟踪它的尺寸。@Quentin。。。只要你。。。那是我的point@John3136在C语言中,除了跟踪,你别无选择。还是我遗漏了什么?你有什么建议?嗨,谢谢你的回复!你能告诉我第一个解决方案是什么意思吗?我们还没有学过动态数组,所以我认为第二个将超越它me@Cookeymiceter添加了一些非常简单的示例代码来说明原理。因此,为了让我了解您的第一个示例,第一个函数是创建2D数组?我不确定主函数中发生了什么。@CookeyMictor否第一个函数只初始化数组,它在主函数中定义并作为参数传递。@CookeyMictor,注意静态声明:这意味着数组在每次调用函数时都是相同的,因此,如果您再次调用该函数,它将修改并返回与第一次相同的数组。这意味着您不能通过简单地调用函数两次来获得两个具有不同内容的随机数组。为此,您需要使用malloc或它的一个朋友动态地分配数组。