如何修复CS50 PSET 1 Mario的代码不太舒服

时间:2019-02-01 14:31:16

标签: c cs50

我对cs50 pset 1(不太舒适的马里奥)的解决方案无法打印出金字塔。相反,它只是打印出一个#。我已经尝试了多次,但是在尝试编译时却发现错误,提示它不能识别int i或分号应移至新行。一旦我更改为此代码,错误最终停止,它可以正确输入,但不会显示金字塔。

#include <cs50.h>
#include <stdio.h>

int main(void)
{
int height;
int spaces;
int hashes;
int row;

do
{
    printf("Height: ");
    height = get_int();
}

while (height < 0 || height > 23);

for (row = 1; row <= height; row++)
    ;
{

    for (spaces = (height - 1) - row; spaces >= 0; spaces--)
        ; 
    {
        printf(" ");
    }

    for (hashes = 2; row < hashes; hashes++)
        ;
    {
        printf("#");
    }
    printf("\n");
}

}

这是终端中的输出

$ make mario clang -fsanitize =带符号整数溢出-fsanitize =未定义-ggdb3 -O0 -std = c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow mario.c -lcrypt -lcs50 -lm -o mario $ ./马里奥 高度:15  #

2 个答案:

答案 0 :(得分:1)

您的主要问题是for循环后的分号。它们构成了for循环的主体,因此循环不执行任何操作。所以换句话说,这里

for (spaces = (height - 1) - row; spaces >= 0; spaces--)
        ;
    {
        printf(" ");
    }

只是变成

{
    printf(" ");
}

对于其他两个for循环同样如此。这就是为什么您希望在循环中发生的事情每次仅发生一次的原因:您以为for循环的主体实际上与所说的循环无关,因此它只运行一次。

此外,这里的循环条件

for (hashes = 2; row < hashes; hashes++)

是错误的,应该相反。您可能想要类似的东西:

for (hashes = 2; hashes < row*2; hashes++)

最后,int main应该返回一个int,所以在函数的末尾添加return 0;

答案 1 :(得分:1)

用户Blaze alerady对正在发生的事情给出了完美的解释。为了清楚起见,我想添加以下内容:

for语句的语法大致为:

<statement>

2+2;可以是任何语句,包括空语句

分号是语句终止符。它指示语句的结尾。如果仅写分号,则它会终止 empty语句。结果,您的循环主体由 empty语句组成。

(作为分号作为语句终止符的另一个示例:{{1}},它将表达式转换为语句。)