控制台中无法居中绘制正方形,仅显示首行,需如何修改?
嘿,我来帮你搞定这个控制台打印居中正方形的问题!
你的代码目前只让正方形的第一行出现在中间,原因很简单:你只在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
相关产品推荐
相关产品推荐

