我对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 #
答案 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}},它将表达式转换为语句。)