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

控制台中无法居中绘制正方形,仅显示首行,需如何修改?

嘿,我来帮你搞定这个控制台打印居中正方形的问题!

你的代码目前只让正方形的第一行出现在中间,原因很简单:你只在main函数里设置了一次光标位置,之后每用cout << endl换行,光标都会自动跳到下一行的最左侧,所以剩下的行都从左边开始打印了,自然看不到完整的居中正方形。

修复后的代码

我调整了代码逻辑,让每一行打印前都重新定位光标,同时还优化了垂直方向的居中效果,让整个正方形真正居中:

#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace System;
using namespace std;

void DibujaCuadrado() {
    const int squareSize = 5; // 正方形边长,方便后续修改
    // 计算水平居中的起始列:窗口中间列(40)减去边长的一半
    int startCol = 40 - (squareSize / 2);
    // 计算垂直居中的起始行:窗口中间行(20)减去边长的一半
    int startRow = 20 - (squareSize / 2);

    for (int row = 0; row < squareSize; row++) {
        // 每一行打印前,把光标移到当前行的起始位置
        Console::SetCursorPosition(startCol, startRow + row);
        for (int col = 0; col < squareSize; col++) {
            cout << "O";
        }
        // 这里不要再用endl了!它会把光标拉回行首,破坏居中
    }
}

int main() {
    Console::SetWindowSize(80, 40);
    DibujaCuadrado();
    _getch();
    return 0;
}

核心修改点拆解

  • 把光标定位逻辑移到循环内:原来只设置一次光标,现在每打印一行前都重新定位,确保每一行的起始点都在中间位置
  • 优化居中计算:原来的代码只让第一行在水平中间,垂直方向从20行开始会让正方形偏下,现在通过startRow = 20 - (squareSize/2)让正方形垂直也居中
  • 移除cout << endl:这个语句会强制光标跳到下一行开头,完全打乱我们手动设置的位置,现在直接通过SetCursorPosition控制下一行的起始点

运行修改后的代码,你就能看到完整的正方形稳稳地显示在控制台中间啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:03:14