簡體   English   中英

如何修復CS50 PSET 1 Mario的代碼不太舒服

[英]How to fix my code for cs50 pset 1 mario less comfortable

我對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 $ ./mario高度:15#

您的主要問題是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; 到功能的末尾。

用戶Blaze alerady對正在發生的事情給出了完美的解釋。 為了清楚起見,我想添加以下內容:

for語句的語法大致為:

for ( ... ) <statement>

其中, <statement>可以是任何語句, 包括空語句

分號是語句終止符 它指示語句的結尾。 如果只寫一個分號,它將終止一個空語句 結果,您的循環主體由空語句組成

(作為分號作為語句終止符的另一個示例: 2+2;它將表達式轉換為語句。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM