0

以下是错误:

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;
}
}

我到底在做什么是错的?

4

2 回答 2

1

for在 C99 及更高版本中,循环的初始位置只能有一个声明:

for (int levelCounter, usrHeight, paddIt = usrHeight - 1, hashMaker, hashCounter;
     ...condition...; ...increment...
    )

但是,您有问题;usrHeight未初始化,因此paddIt是不确定的值。我不得不改变 to 的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转换说明符无关(因此行为未定义),但它是 POSIX 2008 的一部分printf()——它在必要时为大数字添加数千个分隔符。


我没有注意到您已经声明了您在for循环中提到的所有变量。看起来您可以将该循环简化为:

for (levelCounter = 0; levelCounter <= usrHeight; levelCounter++)
{
    printf("%.*s", paddIt, "");
    for (int i = 0; i < hashCounter; i++)
        putchar('#'); 
    paddIt = paddIt - 1;
    hashCounter = hashCounter + 1;
}

这使用来自原始问题中不清楚的预期格式的评论中的信息。

于 2014-02-05T01:43:51.680 回答
-2

为什么不能将此 for 循环转换为 while 循环?这将做同样的事情

while(levelCounter <= usrHeight)

{
 printf("%'' * paddIt %c*hashCounter",paddIt,hashMaker,hashCounter);

 paddIt = paddIt - 1;
 levelCounter = levelCounter + 1;
 hashCounter = hashCounter + 1;
}
于 2014-02-05T01:45:43.037 回答