如何格式化存储不同长度字符串的2D数组,使其打印呈现规整正方形效果
问题原因
输出变形是因为二维数组中不同元素的字符长度不一致,比如p1占2字符、100占3字符、制表符占1字符,输出时没有统一每列宽度,导致列错位。
解决方案
统一设置每列的输出宽度,同时调整边框横线的长度匹配列宽,输出时用格式化控制固定每个元素的占宽即可。以下是可直接运行的修改后代码:
#include <iostream> #include <string> #include <iomanip> using namespace std; // 通用方法:先计算数组中所有元素的最大长度,动态确定列宽 int getMaxWidth(string a[4][4]) { int max_w = 0; for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { if(a[i][j].size() > max_w) max_w = a[i][j].size(); } } return max_w; } void printSquare(string a[4][4], int col_width) { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { // 固定宽度左对齐输出,不足部分自动补空格 cout << left << setw(col_width) << a[i][j]; } cout << endl; } } int main() { string a[4][4]= {{"\xC9", "\xCD", "\xCD", "\xBB"}, {"\xBA", "p1", "p2", "\xBA"}, {"\xBA", "100", "p3", "\xBA"}, {"\xC8", "\xCD", "\xCD", "\xBC"}}; int COL_WIDTH = getMaxWidth(a); // 调整边框横线长度匹配列宽 string h_line(COL_WIDTH, '\xCD'); a[0][1] = a[0][2] = a[3][1] = a[3][2] = h_line; printSquare(a, COL_WIDTH); return 0; }
小提示:如果你使用的终端是UTF-8编码,原本的扩展ASCII制表符可能显示乱码,可以把
\xC9这类符号替换成UTF-8制表符:┌代替\xC9、─代替\xCD、┐代替\xBB、│代替\xBA、└代替\xC8、┘代替\xBC,兼容性更好。
内容的提问来源于stack exchange,提问作者Parth Patel
相关产品推荐
相关产品推荐

