将char 2d数组传递给c语言中的void函数



我是c的新手,但我已经尝试了很长时间,试图让这个工作,即使它看起来很简单。

所以下面是我的目标是做的工作,但我想做2个函数:fillseats()和printseatingplan()[现在我只想让它们都是空白的];

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
char seatingplan[15][15];
memset(seatingplan,'.',sizeof seatingplan);

for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c",seatingplan[k][j]);
}
printf("n");
}
}

所以当我尝试不带指针运行这些函数时,它会给我这些` `:` ij: `我�d:�iH@ =我�B���翼:�

如何使用指针来修复这个

我可以将这个数组传递给printseatingplan()

void printseatingplan(char array[15][15])
{
for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c",array[k][j]);
}
printf("n");
}
}

,然后fillseats()做:

void fillseats(char array[15][15])
{
memset(array,'.',sizeof array);
}

sizeof将只给你指针的大小,而不是整个数组。

你需要将大小传递给函数。我将使用指针指向数组:

void fillseats(size_t rows, size_t cols, char (*array)[cols])
{
memset(array,'.',rows * sizeof(*array));
}
void printseatingplan(size_t rows, size_t cols, char (*array)[cols])
{
for (size_t row = 0; row < rows; row++)
{
for(size_t col = 0; col < cols; col++)
{
printf("%c",array[row][col]);
}
printf("n");
}
}

char array[15][15]用作函数的参数"decays"转换为指向第一个元素的指针,在本例中相当于char (*array)[15])。如果您执行sizeof array而不是函数,则可以获得指针的大小(4或8等)。如果你执行sizeof *array,你只会得到一个维度的大小,15。

一个简单的修复方法:

#include <stdio.h>
#include <string.h>
void fillseats (size_t x, size_t y, char array[x][y])
{
memset(array, '.', sizeof(char[x][y]));
}
void printseatingplan (size_t x, size_t y, char array[x][y])
{
for (size_t i = 0; i < x; i++)
{
for(size_t j = 0; j < y; j++)
{
printf("%c",array[i][j]);
}
printf("n");
}
}
int main (void)
{
char seatingplan[15][15];
fillseats(15, 15, seatingplan);
printseatingplan(15, 15, seatingplan);
}

数组的大小取决于它的类型。问题是数组类型的参数衰减为指针。为了防止这种情况发生,可以向数组传递一个指针。指针不会衰减,因此数组类型的基本部分占先。

void printseatingplan(char (*array)[15][15])
{
for (int k = 0; k < 15; ++k)
{
for(int j = 0; j < 15; ++j)
{
printf("%c", (*array)[k][j]);
}
printf("n");
}
}
void fillseats(char (*array)[15][15])
{
memset(*array,'.',sizeof *array);
}
int main (void)
{
char seatingplan[15][15];
fillseats(&seatingplan);
printseatingplan(&seatingplan);
}

最新更新