You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C语言金字塔程序中while循环未更新变量k的值?

金字塔程序的while循环错误排查

错误根源

变量k在函数开头仅初始化一次,导致其值在后续循环中持续累积,无法满足每行重新计数打印星号的需求:

  • 第一次外层循环(i=1)时,while循环将k递增到1(即2*1-1),完成第一行星号打印。
  • 进入第二次循环(i=2)时,k的当前值已经是1,而终止条件是k != 3,因此只会额外打印2个星号,而非从头开始打印3个。
  • 后续循环中,k会持续增长,当k超过当前行需要的2*i-1时,while循环直接跳过,不再打印星号。

修复方案

将k的初始化移至外层for循环内部,确保每处理一行时,k都从0开始重新计数:

#include <stdio.h>

int main()
{
  int height, i, j;

  printf("This program is to make a pyramid\n\n");

  printf("Enter the pyramid height: \n");
  scanf("%d", &height);

  for (i = 1; i <= height; i++) 
  {
    int k = 0; // 每行开始时重置k为0
    for (j = 1; j <= height - i; j++)
    {
      printf(" ");
    }

    while (k != 2 * i - 1) 
    {
      printf("*");
      ++k;
    }
    printf("\n");
  }

  return 0;
}

替代优化方案

可以直接用for循环替代while循环,省去单独初始化k的步骤,代码更简洁直观:

#include <stdio.h>

int main()
{
  int height, i, j;

  printf("This program is to make a pyramid\n\n");

  printf("Enter the pyramid height: \n");
  scanf("%d", &height);

  for (i = 1; i <= height; i++) 
  {
    for (j = 1; j <= height - i; j++)
    {
      printf(" ");
    }
    // 用for循环直接控制星号数量
    for (int k = 0; k < 2 * i - 1; k++)
    {
      printf("*");
    }
    printf("\n");
  }

  return 0;
}

内容的提问来源于stack exchange,提问作者Daksh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:20:43