为什么当我在C中使用for循环时,它会无限次地打印我的文本? (我是初学者)

问题描述 投票:-3回答:3

我已经创建了一系列for循环但由于某种原因,我继续获得无限多的#s作为我的输出。我不确定为什么会这样。我是编程的初学者,我有点困惑。我的代码是:

for (int i = 0; i < h; i++)
{
    for (int x = 0; x < 0; x = -1 * i + (h - 1))
    {
        printf(" ");
    }

    for (int y = 0; y < h + 1; y = i + 2)
    {
        printf("#");
    }

    printf("\n");
}

我想要获得的输出如下:

    ##\n
   ###\n
  ####\n
 #####\n
######\n

如果有人可以帮助我,我将非常感激:)

谢谢

c
3个回答
1
投票

在第三个for循环中你有for (int y = 0; y < h + 1; y = i + 2)增量语句y = i + 2在每次运行通过主体后重置循环变量y到相同的值,如果这个值小于h你得到一个无限循环。

你可以试试这个:

int h = 7;
for (int i = 0; i < h; i++)
{
    int x;
    for (x = 0; x < h - i; x++)
    {
        printf(" ");
    } 

    for (int y = -2; y < i; y++)
    {
        printf("#");
    }

    printf("\n");
}

这会产生:

       ##                                                                                                                      
      ###                                                                                                                      
     ####                                                                                                                      
    #####                                                                                                                      
   ######                                                                                                                      
  #######                                                                                                                      
 ########

编辑:要将# 1空格的三角形向左移动,需要将第二个循环更改为

for (x = 0; x < h - i - 1; x++)
{
    printf(" ");
} 

1
投票

打印空格的循环将永远不会执行 - 您将x初始化为0,然后循环,而x < 0则立即为false。

循环打印'#'永远不会退出,因为y没有在循环中修改y = i + 2将不会推进y - 它将简单地无限期地赋予它值2。你实际上在之前的x循环中有一个类似的问题,它从来没有那么远。

通过使用调试器和步进代码而不是在SO上发布问题,可以最容易地发现上述内容。

实际上,只使用一个内循环就可以生成模式:

    for( int i = 0; i < h; i++ )
    {
        for( int x = 0; x < h + 1; x++ )
        {
            putchar( x < h - i - 1 ? ' ' : '#' ) ;
        }

        putchar( '\n' );
    }

或者可能不那么“聪明”:

    for( int i = 0; i < h; i++ )
    {
        for( int x = 0; x < h + 1; x++ )
        {
            if( x < h - i - 1 )
            {
                putchar( ' ' ) ;
            }
            else
            {
                putchar( '#' ) ;
            }
        }

        putchar( '\n' );
    }

0
投票

这个问题是您不会更改循环变量xy的值,因此它们不会正常终止。你的程序继续执行第二个for循环的块。

让我们来看看第一个for

for (int x = 0; x < 0; x = -1 * i + (h - 1))

当执行此操作时,hi是固定的,你也不会在这个for循环的主体中更改它们。让我们说h10; i0

这意味着它开始于x0。它没有执行它的块,因为x < 0是假的。

然后第二个for

for (int y = 0; y < h + 1; y = i + 2)

如果你解决这个问题,你会发现在第一次迭代之后,y将永远是0 + 22。循环条件变为:2 < 10 + 1(再次假设h10),这总是正确的。这意味着你的循环继续旋转forever。

试试这个:

for (int i = 0; i < h; i++)
{
    for (int x = 0; x < h - i; x++)
    {
        printf(" ");
    }

    for (int y = i; y < h; y++)
    {
        printf("#");
    }

    printf("\n");
}

我认为它有一两个OBO(Out-By-One错误),但我相信你很快就能解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.