c - 有什么办法可以让这段代码变得更简单吗?

标签 c cs50

我是一名初级程序员,通过哈佛提供的 CS50 在线类(class)学习 C。该程序应该提示用户输入高度,当用户输入高度(1-8)时,会根据用户输入的高度打印金字塔。当您输入 2 时,它会输出一个 2 行高、中间有 2 个空格的小金字塔。我的程序做了它应该做的事情,但我确信有比嵌套循环更好的方法。

我尝试为金字塔的一侧制作一个循环,而不是两个循环。我认为这是正确的方法,但执行得很糟糕。

{

    for (int spaces = height - line; spaces > 1; spaces--)
    {
        printf(" ");

    }
    for (int hashes = 0; hashes < line + 1; hashes++)
    {
        printf("#");
    }

    printf("  ");

    for (int hashes = 0; hashes < line + 1; hashes++)
    {
        printf("#");
    }
    for (int spaces = height - line; spaces > 1; spaces--)
    {
        printf(" ");
    }
    printf("\n");

}

最佳答案

以下方法更有效,并且 afaict 会产生相同的结果:

static char hashes[80];
memset(hashes, '#', sizeof(hashes));
assert( height < sizeof(hashes) );

for( int line=0; line < height; line++ ) {
  printf( "%*.*s  %-*.*s\n",
    height, line+1, hashes,
    height, line+1, hashes );
}

您是一名初学者,其中的内容远比您所看到的要多。 “技巧”在于 printf(3) 在其格式字符串中拥有一种自己的语言,这种语言一开始就令人畏惧。由于您的输出是常量(散列),因此您可以使用常量字符串并通过设置其大小、截断字符串以及选择左对齐或右对齐来“格式化”字段。

在学习C语言时,你必须学习如何构造循环。在使用C时,你必须学习C标准库(以及问题领域的其他库)。通常,这些库可以让您避免循环,从而简化您的代码。

关于c - 有什么办法可以让这段代码变得更简单吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57398583/

相关文章:

c - 为什么我的strcasecmp函数会带来错误消息? (C)

c - 如何修复 bfSize 字段中的 header

c - 逆向工程方程将密文转换为明文

c - "Linking Error: Duplicate public_main in module"构建时

python - 在扩展中使用 PyModule_AddIntConstant()

C# - Marshall 并将 void 指针传递给从 C# 调用的 C 函数

c - 位图文件的填充

c - 从c中的fread()形式读取缓冲区数据

c - 如何将 const char* 指针传递给 fts_open()

c - PRQA : How to ignore some specific files?