gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:13:51 25 4
gpt4 key购买 nike

错误如下:

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

我到底做错了什么?

最佳答案

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

这使用了有关预期格式的评论中的信息,而原始问题中并不清楚该信息。

关于C 非常基本的程序中的编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com