gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:18:57 25 4
gpt4 key购买 nike

我是编程新手,尤其是 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“图形”格式;这部分很简单,并没有反射(reflect)在这个示例代码中。

我的问题是,无论我在实验中尝试什么排列 - 这里有 * 而不是那里,或者那里和这里,或者那里但不是这里,或者两个索引而不是三个,或者这个或那个 - 我无法弄清楚幕后发生了什么。如果我使用整数,我可以在网上找到我需要的示例,但是使用字符/字符串/指针会增加我无法获得的复杂性。任何有助于更好地理解我需要的概念的帮助将不胜感激。

最佳答案

我的想法是将每个数字放在一个字符指针数组中

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) 两边有括号的原因code> 是因为我们想要选择我们需要的图形,如果我们想要第一个图形,我们调用 *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_
_\\/_ \_

关于c - 如何在 C 中定义/使用 2 维字符串数组(3 维字符?)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com