我需要创建一个看起来像这样的二维字符:
----
|..|
|..|
----
要做到这一点,我写了一个看起来像
的函数numed Build_Screen#include<stdio.h>
#include"build.h"
void Build_Screen(char **c, int w, int k)
{
int i=0, j=0;
for(; i<w;i++)
{
j=0;
for(; j<k;j++)
{
if (i==0||i==w-1)
c[i][j]='-';
else
{
if(j==0||j==k-1)
c[i][j]='|';
else
c[i][j]='.';
}
}
}
}
当我试图像那样运行
时char screen[5][5];
Build_Screen(screen, 5, 5);
它引起了分割失败。我该如何解决这个问题?
答案 0 :(得分:2)
问题在于你的功能
char **
与char[5][5]
不同,所以只需更改
void Build_Screen(char **c, int w, int k)
与
void Build_Screen(char c[5][5], int w, int k)
你必须传递数组,而不是pointer
传递给char pointer
,你可以看到here,它已被解释。
如果您事先不知道尺寸,请以这种方式使用malloc
void Build_Screen(char **c, int w, int k)
{
int i, j;
for(i=0;i<w;i++)
{
for(j=0;j<k;j++)
{
if (i == 0 || i == w-1)
c[i][j] = '-';
else
{
if(j==0||j==k-1)
c[i][j]='|';
else
c[i][j]='.';
}
}
}
}
int main(int argc, char **argv)
{
char **screen;
int i, rowCount, columnCount;
rowCount = 5;
columnCount = 5;
screen = malloc(rowCount * sizeof(char *));
if (screen == NULL)
return -1;
for (i = 0 ; i < rowCount ; i++)
{
screen[i] = malloc(columnCount);
if (screen[i] == NULL)
{
i -= 1;
for( ; i >= 0 ; i--)
free(screen[i]);
free(screen);
return -1;
}
}
Build_Screen(screen, rowCount, columnCount);
/* finished using it */
for (i = 0 ; i < rowCount ; i++)
free(screen[i]);
free(screen);
return 0;
}
请注意,我假设您将在不使用printf
或类似函数的情况下打印行,如果您要这样做,那么只需在字符串末尾添加一个终止'\0'
。
答案 1 :(得分:0)
实际上,当你声明:
char screen[5][5];
发生了什么事?它在堆栈上分配5*5*sizeof (char)
个连续字节,由screen[0]
指向。
因此,screen[0][1]
严格等同于*(screen[0] + 0*5 + 1);
通过将功能的签名更改为
,可以轻松解决您的问题void Build_Screen(char c[5][5], int w, int k);
我想你想要一个适用于任何尺寸地图的功能。除了在C99中,C中的正版2D数组不会发生这种情况。更多详细信息here。
答案 2 :(得分:0)
char [5] [5]是2D数组,不是char **。这是一个由25个字符组成的连续区域:
00 01 02 03 04 10 11 12 13 14 20 ...
char **
是指向指针的指针:
0 -> 00 01 02 03 04
1 -> 10 11 12 13 14
2 -> 20 ...
3 -> 30 ...
4 -> 40 ...
你必须这样声明:
char ascreen[5][5];
char *screen[5];
for(i=0; i<5; i++) screen[i] = &(ascreen[i][0]);
Build_Screen(screen, 5, 5);
编辑:这是一个完整的程序:
#include<stdio.h>
void Build_Screen(char **c, int w, int k)
{
int i=0, j=0;
for(; i<w;i++)
{
j=0;
for(; j<k;j++)
{
if (i==0||i==w-1)
c[i][j]='-';
else
{
if(j==0||j==k-1)
c[i][j]='|';
else
c[i][j]='.';
}
}
}
}
int main() {
int i;
char ascreen[5][5];
char *screen[5];
for(i=0; i<5; i++) screen[i] = &(ascreen[i][0]);
Build_Screen(screen, 5, 5);
for(i=0; i<5; i++) {
printf("%.5s\n", screen[i]); /* or printf("%.5s\n", ascreen[i]); */
}
return 0;
}
,输出为:
-----
|...|
|...|
|...|
-----
答案 3 :(得分:-1)
您还可以将数组作为一维数组进行访问。 以下代码在本地成功测试:
void Build_Screen(char* c, int w, int k)
{
int i = 0, j = 0;
for (; i<w; i++)
{
j = 0;
for (; j<k; j++)
{
if (i == 0 || i == w - 1)
c[i*w+j] = '-';
else
{
if (j == 0 || j == k - 1)
c[i*w + j] = '|';
else
c[i*w + j] = '.';
}
}
}
}
int main()
{
char screen[5][5];
Build_Screen((char*)screen, 5, 5);
}
答案 4 :(得分:-2)
正如@iharob所写,你的功能签名没有按预期工作。你应该使用单个指针char * c并像这样或类似的东西索引数组:
c[i+w*j]