在C非常基本的程序中编译问题

时间:2014-02-05 01:34:00

标签: c cs50

以下是错误:

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

我到底在做什么是错的?

2 个答案:

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