最直接方式是两层for循环嵌套:外层控行、内层控列,每行结束需换行。示例打印4行×6列矩形:外层i从0到3,内层j从0到5输出,每行后加println。

用 for 循环嵌套打印实心矩形
最直接的方式是两层 for:外层控制行数,内层控制每行的列数。关键不是“怎么写循环”,而是别漏掉换行——很多初学者输出一长条就停了。
示例:打印 4 行 × 6 列的 * 矩形:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 6; ++j) {
std::cout << "*";
}
std::cout << "\n"; // 这一行不能少,也不能放在内层循环里
}- 行数和列数建议用变量(如
rows、cols)代替字面量,方便后续改参数 - 别用
std::endl替代"\n",它会强制刷新缓冲区,对纯图案输出没好处,还略慢 - 如果终端不支持 UTF-8 或用了宽字符环境,
*可能显示异常;临时调试可换为 ASCII 字符如#或o
打印空心矩形要判断边界位置
空心意味着只有第一行、最后一行、第一列、最后一列输出 *,中间全为空格。核心是把“是否在边界上”转成一个清晰的条件表达式,而不是写四段独立逻辑。
假设矩形高 h、宽 w,当前坐标为 (i, j)(从 0 开始),边界判断就是:
立即学习“C++免费学习笔记(深入)”;
if (i == 0 || i == h-1 || j == 0 || j == w-1) {
std::cout << "*";
} else {
std::cout << " ";
}- 注意
i == h-1和j == w-1—— 下标从 0 开始,最后一行/列索引是size - 1 - 如果
h或w小于 2,这个逻辑会出错(比如 1×1 矩形会输出两个*),实际使用前应加校验:if (h - 别忘了每行末尾仍要
std::cout ,否则所有行挤在一起
用 string 构造单行再重复输出更简洁
当矩形是实心且字符统一时,没必要每列都调用一次 std::cout。C++ 的 std::string 支持重复构造,配合 std::cout 流输出,代码更短、性能略好。
std::string row(w, '*'); // 构造含 w 个 '*' 的字符串
for (int i = 0; i < h; ++i) {
std::cout << row << "\n";
}-
std::string(w, '*')是高效构造方式,比循环 push_back 快,也比拼接更直观 - 空心矩形不适合这种写法,因为每行内容不同;但首行、末行可用
std::string(w, '*'),中间行可用"*" + std::string(w-2, ' ') + "*" - 如果
w是 0 或负数,std::string构造会抛异常或行为未定义,务必确保参数合法
常见错误:输出错位、多空格、中文终端乱码
图案变形往往不是逻辑错,而是输出环境或细节处理不到位。
- 误用
\t代替空格:制表符宽度不固定,会导致列不对齐;一律用" "(空格字符) - 行末多输出一个空格:检查内层循环条件,比如写成
j 就会多打一列 - Windows 控制台默认是 GBK 编码,若源文件存为 UTF-8 且含中文注释,可能干扰输出——图案本身用 ASCII 字符(
*、#、.)基本无兼容问题 - 忘记
#include <iostream>或using namespace std;,编译报std::cout未声明,这类错误虽基础,但新手常卡在这一步
真正难的不是嵌套几层循环,而是把“画图”这件事拆解成坐标、边界、字符选择三个稳定维度,然后让每个维度的变化都可控。一旦开始混用硬编码、动态计算和特殊符号,图案就容易失控。



















