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

CS50右对齐金字塔代码异常求助:输出不符合预期

CS50右对齐金字塔代码错误原因解析

问题情况

刚开始学CS50,做右对齐金字塔的挑战时,代码跑出来的结果不对:

#
  #  #
  #  # #

我要的预期输出是:

#
 ##
###

后来改了k的计算方式,输出变成这样:

#
 # #
###

虽然最后搞定了挑战,但还是没搞懂最初的代码为啥会出错,想弄明白原因。

出错的代码

#include<stdio.h>

void row(int i) {
    for (int y = 0; y < i ; y++) {
        int k = 3 - i;

        if (k > 0 ) {
            for (int x = 0 ; x < k ; x++) {
                printf(" ");
            }
        }

        printf("#");
    }

    printf("\n");
}

int main(void) {
    int len = 3;

    for (int ye = 0; ye < len ; ye++) {
        row(ye+1);
    }
}

错误根源

核心问题就是打印空格的循环被放在了打印#的循环里面,导致每输出一个#之前,都会重复打印一遍空格。

举个例子,当row函数接收的i=2(对应金字塔的第二行)时,k=3-2=1,此时外层的y循环会执行2次:

  1. 第一次循环:先打印1个空格,再输出1个#
  2. 第二次循环:又打印1个空格,再输出1个#
    所以第二行就变成了 # #,而不是我们要的 ##。

正确的逻辑应该是:先一次性把整行需要的空格全部打印完,再接着打印对应数量的#,而不是每打一个#就重复打一次空格。

你修改后的输出说明

你调整k的计算方式后,应该是修正了空格的数量,但当时可能还没把空格打印的逻辑移到#循环外面,所以第二行的#之间还是多了空格。不过你最后解决了问题,说明后来调整了循环结构,把空格打印放到了#循环的外层,这才得到了正确的右对齐金字塔。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:27:24