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

标签 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“图形”格式;这部分很简单,并没有反射(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/

相关文章:

mysql - 根据条件剪切行中的第一个字符串

c - mmap() 失败,而 devme2 成功 (C/CPP) [Allwinner A20]

c - 不懂简单的C程序if/else结果

c - 无法从文件中扫描元素并直接将其放入数组中

c++ - ifstream 的 std::getline,使用参数字符串或 char *

java - 在java中使String首字母大写

c - HMAC-SHA1 的 Objective-C 示例代码

c++ - 使用特殊规则将一个数组分成两个数组

java - 如何在java中创建ArrayList数组?

java - 使用方法引用将 List 类型 <Integer> 转换为 String[] 数组