c++ - 如何在不使用循环的情况下快速打印由指向指针的指针组成的二维字符数组?

标签 c++ arrays pointers char printf

我正在制作 ASCII 游戏,我需要性能,所以决定使用 printf()。但是有一个问题,我将我的 char 数组设计为多维 char ** 数组,打印它输出的是内存垃圾而不是数据。我知道可以使用 for 循环打印它,但性能会迅速下降。我需要像静态数组 [][] 一样打印它。有办法吗?

我做了一些工作数组和非工作数组的例子。我只需要 printf() 来处理非工作数组。

编辑:在 Win 10 上使用 Visual Studio 2015,是的,我测试了性能并且 cout 比 printf 慢得多(但我真的不知道为什么会这样)

#include <iostream>
#include <cstdio>

int main()
{
    const int X_SIZE = 40;
    const int Y_SIZE = 20;

    char works[Y_SIZE][X_SIZE];
    char ** notWorking;

    notWorking = new char*[Y_SIZE];
    for (int i = 0; i < Y_SIZE; i++) {
        notWorking[i] = new char[X_SIZE];
    }

    for (int i = 0; i < Y_SIZE; i++) {
        for (int j = 0; j < X_SIZE; j++) {
            works[i][j] = '#';
            notWorking[i][j] = '#';
        }
        works[i][X_SIZE-1] = '\n';
        notWorking[i][X_SIZE - 1] = '\n';
    }
    works[Y_SIZE-1][X_SIZE-1] = '\0';
    notWorking[Y_SIZE-1][X_SIZE-1] = '\0';

    printf("%s\n\n", works);
    printf("%s\n\n", notWorking);

    system("PAUSE");
}

注意:我想我可以制作某种缓冲区或静态数组来仅用于复制和显示数据,但我想知道如果没有它是否可以完成。

最佳答案

如果您想使用 printf 打印二维结构而不用循环,您需要将它作为连续的一维 C 字符串呈现给 printf。由于您的游戏需要将字符串作为 2D 结构进行访问,因此您可以创建一个指向此平面结构的指针数组,如下所示:

Array and Buffer

指针数组将缓冲区分区以用作二维结构,而缓冲区本身可以通过 printf 打印,因为它是一个连续的 C 字符串。

下面是相同的代码结构:

// X_SIZE+1 is for '\n's; overall +1 is for '\0'
char buffer[Y_SIZE*(X_SIZE+1)+1];
char *array[Y_SIZE];
// Setup the buffer and the array
for (int r = 0 ; r != Y_SIZE ; r++) {
    array[r] = &buffer[r*(X_SIZE+1)];
    for (int c = 0 ; c != X_SIZE ; c++) {
        array[r][c] = '#';
    }
    array[r][X_SIZE] = '\n';
}
buffer[Y_SIZE*(X_SIZE+1)] = '\0';
printf("%s\n", buffer);

Demo.

关于c++ - 如何在不使用循环的情况下快速打印由指向指针的指针组成的二维字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283143/

相关文章:

c++ - 两个排序数组的交集

从 C 中的另一个数组创建数组

python - C类型, python 。如何在函数参数之一中传回指向 C 动态分配的 double 组的指针?

c++ - boost 安装验证

c++ - 如何隐藏TDateTimePicker中的 "Today"按钮?

arrays - 类型末尾的双问号是什么意思?

c - IAR EWARM (ICC) - 表达式必须有一个常量值

c++ - 如何在函数中返回一个 const char*?

c++ - 在分配器中使用 new 和 *alloc 函数时有区别吗?

c++ - 为什么我可以在私有(private)类型上使用 auto?