以下是错误:
mario.c:23:25: error: expected identifier or ‘(’ before ‘int’
for (int levelCounter, int usrHeight, int paddIt = usrHeight - 1, char hashMaker, int hashCounter;(levelCounter <= usrHeight);)
^
mario.c:25:39: error: expected ‘)’ before ‘paddIt’
printf("%'' * paddIt %c*hashCounter"paddIt,hashMaker,hashCounter);
^
^标识编译器说错误发生的位置。
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int usrHeight = 0;
int levelCounter = 0;
int paddIt = 0;
int hashCounter = 2;
char hashMaker = "#";
do
{
printf("How high?\n");
int usrHeight = GetInt();
}
while ( usrHeight > 23 || usrHeight < 0);
if ( usrHeight >= 0 && usrHeight <= 23);
{
printf("constructing...\n");
}
for (int levelCounter, int usrHeight, int paddIt = usrHeight - 1, char hashMaker, int hashCounter;(levelCounter <= usrHeight);)
*^ This is where the first error is occuring*
{
printf("%'' * paddIt %c*hashCounter"paddIt,hashMaker,hashCounter);
*^ And here is where the second is*
paddIt = paddIt - 1;
levelCounter = levelCounter + 1;
hashCounter = hashCounter + 1;
}
}
我到底在做什么是错的?
答案 0 :(得分:1)
您可以在C99及更高版本的for
循环的初始位置只有一个声明:
for (int levelCounter, usrHeight, paddIt = usrHeight - 1, hashMaker, hashCounter;
...condition...; ...increment...
)
但是,你有问题; usrHeight
未初始化,因此paddIt
是不确定的值。我必须将hashMaker
的类型更改为int
。您只能使用一种类型。
坦率地说,声明循环控件中的许多变量是错误的。如果你这样做,所有这些都应该被初始化。否则,您可以使用:
for (int levelCounter; ...condition...; ...increment...)
{
int usrHeight = -1, paddIt = usrHeight - 1, hashCounter = 0;
char hashMaker;
...loop body...
}
这解决了一些问题。如果需要在循环迭代中保留的变量值(这在每次迭代时定义并初始化它们),则应在循环外定义额外变量。在for
循环中,您很少会声明多个变量,甚至更多两个变量。我几乎可以证明:
for (int i = min, j = max; i < j; i++, j--)
有一个变量向上计数而另一个向下计数,但你可以在循环体中计算j
,尤其是min
为0时。
向我提供代码审查的原始代码(固定版本)的人会对我不屑一顾 - 更清楚地重写代码。
第二个问题是缺少逗号,编译器说它期望)
:
printf("%'' * paddIt %c*hashCounter"paddIt,hashMaker,hashCounter);
应该是:
printf("%'' * paddIt %c*hashCounter", paddIt, hashMaker, hashCounter);
第一部分实际上是一个格式错误的转换规范;你可能意味着"%%''..."
或者你可能完全意味着别的东西,例如:
printf("%' *.*c", paddIt, hashMaker, hashCounter);
单引号仍然与%c
转换说明符无关(因此行为未定义),但它是printf()
的POSIX 2008的一部分 - 它在必要时为大数字添加了数千个分隔符
我没注意到你已经在for
循环中声明了你提到的所有变量。看起来你可以将这个循环减少到:
for (levelCounter = 0; levelCounter <= usrHeight; levelCounter++)
{
printf("%.*s", paddIt, "");
for (int i = 0; i < hashCounter; i++)
putchar('#');
paddIt = paddIt - 1;
hashCounter = hashCounter + 1;
}
这使用了有关预期格式的评论中的信息,这些信息在原始问题中并不明确。
答案 1 :(得分:-2)
为什么不能将此for循环转换为while循环?这将做同样的
while(levelCounter <= usrHeight)
{
printf("%'' * paddIt %c*hashCounter",paddIt,hashMaker,hashCounter);
paddIt = paddIt - 1;
levelCounter = levelCounter + 1;
hashCounter = hashCounter + 1;
}