[英]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.