我是编程新手,尤其是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会增加整体的“复杂程度”,而我却没有。任何对更好地理解我需要的概念的帮助将不胜感激。
答案 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
,但如果要要调用图形的底线,我们需要i
为4
。就像*(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_
_\\/_ \_