C++实现矩形中间行打印指定文本的代码优化求助
解决终端矩形绘制中文本居中及中间行判断问题
看起来你已经快搞定了,核心问题就是两个:中间行的判断逻辑错了,还有文本没在矩形里居中对齐。咱们来一步步修正你的代码:
首先,你的if(mid)判断完全不对——这是在检查mid是否非零,而不是当前循环到了中间行。另外,setw的用法也没法帮你实现文本居中,得手动计算左右的空格数。
下面是修改后的完整代码,完全符合你的需求:
#include <iostream> #include <iomanip> #include <string> using namespace std; void print_row(int const width) { // 用string简化边框行的绘制,替代原来的循环 cout << '+' << string(width, '-') << '+' << endl; } void print_rectangle(int const width, int const height, const string& text = "Hey") { // 计算中间行的索引:不管height是奇数还是偶数,都取中间偏上的位置,匹配你的示例 int mid_row = (height - 1) / 2; print_row(width); for (int i = 0; i < height; ++i) { cout << '|'; if (i == mid_row) { // 计算文本左右的空格,实现居中 int left_padding = (width - text.length()) / 2; // 左边填充空格,输出文本,再填充右边剩余的空格 cout << string(left_padding, ' ') << text << string(width - left_padding - text.length(), ' '); } else { // 非中间行直接填充width个空格 cout << string(width, ' '); } cout << '|' << endl; } print_row(width); } int main() { int width {}; int height {}; cout << "Enter width and height: "; cin >> width >> height; // 默认输出"Hey",也可以自定义文本,比如:print_rectangle(width, height, "Hello!"); print_rectangle(width, height); return 0; }
关键修改点说明:
- 正确的中间行判断:用
i == mid_row替代原来的if(mid),mid_row = (height - 1)/2的计算方式能适配奇数和偶数高度——比如你示例里的height=6,计算后mid_row=2,正好对应循环到第3行(索引从0开始),和示例效果一致。 - 文本居中实现:通过计算左右空格数,让文本刚好放在矩形的中间位置。如果文本长度比width小,左右空格会尽量均匀;如果文本长度等于width,就直接填满整个行。
- 代码简化:用
string(n, char)的方式快速生成重复字符,替代原来的循环,让代码更简洁易读。 - 扩展性:把文本作为可选参数传入,默认是"Hey",你可以轻松改成其他内容。
测试输入5 6,输出就会和你给出的示例完全一致:
Enter width and height: 5 6 +-----+ | | | | | Hey | | | | | +-----+
内容的提问来源于stack exchange,提问作者Mohamed Alkalam




