【问题标题】:Printing a matrix without for loops打印没有 for 循环的矩阵
【发布时间】:2015-05-17 14:57:13
【问题描述】:

我正在尝试使用单个 puts 而不是嵌套循环来打印 char 矩阵,但我总是在打印结束时再得到一个字符。我要做一个乒乓球游戏,我需要尽快更新屏幕。

void main()
{
    int x, y;
    char map[40][80];

    for(y=0; y<40; y++)
    {
        for(x=0; x<80; x++)
        {
            map[y][x]='o';    //Just for testing.
        }
    }
    puts(map);
}

使用此代码打印的最后两行是:

ooooooooooooo...o (80 'o's)
<

【问题讨论】:

  • 是的,我打错了。 mapa 实际上是地图。语言是 C。
  • 字符串需要以空值结尾。

标签: c string matrix printing puts


【解决方案1】:
#include <stdio.h>

int main(int argc, char **argv)
{
    int x, y;
    char map[40*80+1];

    for(y=0; y<40; y++) {
        for(x=0; x<80; x++) {
            map[y*80+x]='o';
        }
    }
    map[40*80] = '\0';
    puts(map);

    return 0;
}

我已将地图更改为线性数组。这样更容易在末尾添加\0 来关闭字符串。没有\0puts() 命令不知道何时停止打印。在您的情况下,它只是一个 &lt;,但它可能会导致打印很多字符!

另外,我不会依赖多维数组在内存中线性映射的事实。

【讨论】:

  • “我不会依赖...的事实”:总的来说,您是对的,但是对于字符数组,这是由标准保证的。 `sizeof(char) 定义为 1。请注意,它并不暗示 CHAR_BIT == 8。此外,可能适合通过换行符终止每一行以获得矩形输出,与控制台尺寸无关..跨度>
  • 尺寸应该是#defines。它们很可能在后面的代码中需要,因此不需要在任何地方都有它们,并且一个清晰的名称会大大增加可读性。
  • @Olaf 终止每一行可能不是 OP 需要的:他可能正准备将字符串发送到 LCD 显示器左右。我同意并非常支持使用#defines,这不是风格问题。
  • 这就是为什么我没有声明终止每一行,但它“可能合适”。如果我错了,请纠正我,但这是否意味着一个选项或需要考虑的事情?即使是 LCD 驱动程序也必须解释字符串(至少对于 NUL),并且没有嵌入的标签,因此无论是否解释换行符至少是开放的。请注意,没有液晶显示器(顺便说一句:“液晶显示器”?)没有图形(带有字体渲染器)或至少解释一些基本控制字符(“智能显示器”)甚至ANSI 序列。
  • 关于#defines:是的,不是,但问题是没有太多经验,我认为在答案中包含一些好的编程风格以帮助改进代码实际上是上帝的风格质量(甚至更多,因为 TO 也传播文字)。但是,我应该将此评论标记为旁注,抱歉我忘记了。
【解决方案2】:

您可以使用fwrite(3)(或write(2),如果您不想要缓冲,但如果您在同一写入中清除屏幕,您可能会这样做)。

fwrite(map, 80, 40, stdout); // or any two numbers whose product is 80*40

write(1, map, 80*40);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多