如何在C中定义/使用字符串的二维数组(字符的3-d?)?

时间:2019-04-19 05:04:07

标签: c arrays string pointers char

我是编程新手,尤其是C语言。只是想挠痒痒。

在过去的三天里,尝试使用ncurses来做一个ASCII艺术的人,做跳插孔,但是我只是没有在C中得到“字符串”(我知道字符串并不是真正的C概念,只是字符数组),而我并没有真正获得指针,也没有真正获得指向字符数组的指针,等等。

原谅艺术;这只是概念的证明。

并且我现在不尝试制作动画(甚至不使用ncurses)(那部分很容易);我只是想弄清楚如何使用数组来存储动画帧(尽管我愿意接受其他想法,如果它们在概念上更简单)。

#define NumOfFrames      4  // Num of animation frames
#define WidthOfFrames   15  // Characters per animation line
#define FrameHeight  5  // Frame is this many lines tall.

const char *D51[NumOfFrames][FrameHight][WidthOfFrames] = {{
    " \\ 0 /  ",
    "  \\|/   ",
    "   |     ",
    "  / \\   ",
    "_/   \\_ "
},
{
    "         ",
    " __0__   ",
    "/  |  \\  ",
    "  / \\   ",
    " _\\ /_  "
},
{
    "         ",
    "   o     ",
    " /\\ /\\ ",
    " |/ \\|  ",
    " _\\ /_  "
},
{
    "         ",
    "         ",
    "   __  ",
    "  /_\\\\0_  ",
    " _\\\\/_  \\_"
}};

void main(int argc, char *argv[]) {

    FILE *f = fopen("log.txt","w");
    if (f == NULL) {
    printf("Error opening file!\n");
    exit(1);
    }

    // Try to print each frame to a text file to wrap
    // my brain around how this works.
    for (int x=0;x<NumOfFrames;x++) {
        for (int y=0;y<FrameHeight;y++) {
            for (int z=0;z<WidthOfFrames;z++) {
                fprintf(f, "%c", D51[x][y][z]);
            }
            fprintf(f,"\n");
        }
    }

    fclose(f);
}

在这段代码中,我只是想弄清楚如何操作字符串,将图像写入文本文件。了解概念之后,我将其转换为ncurses的“图形”格式。这部分很简单,并且不会在此示例代码中反映出来。

我的问题是,无论我在实验中尝试哪种排列方式-一个*这里不在那里,那里不在那里,那里不在那里但不是两个索引而不是三个索引,那个或那个无法弄清楚到底发生了什么。我可以在网上找到有关使用整数的情况的示例,但是使用chars / strings / pointers会增加整体的“复杂程度”,而我却没有。任何对更好地理解我需要的概念的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我以为每个图形都包含在一个char指针数组中

const char *D51 [FrameHeight] = {
" \\ 0 /  ",
"  \\|/   ",
"   |     ",
"  / \\   ",
"_/   \\_ "
};

后接其他数字* D52,* D53,* D54。然后,我们将有一个指向该指针的指针,该指针将保存这些图形的地址,例如

const char **ptr [NumOfFrames];
*ptr = D51;
*(ptr+1) = D52
..

现在我们已经拥有分配给** ptr的每个单个字符的地址,无论是直接还是间接地,我们都可以继续进行图形打印。例如,这将给我们第一个数字

for (int i=0; i<5; i++)
printf("%s\n", *(*(ptr)+i));

并使*(*(ptr)+i)更加清晰,让我们对其进行分解 **ptr是指向指针的指针,因此*ptr将保存指针的地址,*(ptr)周围有括号的原因是,如果我们想选择所需的图形,希望我们将第一个数字称为*ptr,如果要显示第二个数字,我们只需调用*(ptr+1),依此类推。

+i允许我们指定要调用图形的哪一行,例如,如果要调用第一行,可以将i保留为0,但如果要要调用图形的底线,我们需要i4。就像*(ptr)+4

现在我们既指定了图形编号又指定了行号,只需添加*运算符即可取消对指针的引用。 *(*(ptr)+i)

我编写的示例代码:

..
..

const char *D54 [FrameHeight] = {
"         ",
"         ",
"   __  ",
"  /_\\\\0_  ",
" _\\\\/_  \\_"
};

const char **ptr [NumOfFrames];


int main(){
*ptr = D51;
*(ptr+1) = D52;
*(ptr+2) = D53;
*(ptr+3) = D54;

for(int j=0; j<4; j++)
{
  for (int i=0; i<5; i++)
    printf("%s\n", *(*(ptr+j)+i));
puts (" "); //this is nothing more than a newline character
}
return 0;
}

输出:

 \ 0 /
  \|/
   |
  / \
_/   \_


 __0__
/  |  \
  / \
 _\ /_


   o
 /\ /\
 |/ \|
 _\ /_



   __
  /_\\0_
 _\\/_  \_