这里没有真正的捷径:你必须把它们都拉到相同的长度。选择哪种长度:很难。您可能首先必须制作所有行,然后找到最长的行,将所有行格式化为具有相同长度,然后制作顶部和底部栏。
您可以在标准 C++ 中使用 iostreams / stringstream 来做到这一点。但这真的很痛苦。 iostreams 根本不是一个好的输出格式库。
我建议使用支持格式字符串的fmtlib。所以你可以先格式化所有行,并保存最长的长度
#include "fmt/format.h"
#include "fmt/ranges.h"
#include <algorithm>
#include <fmt/core.h>
#include <string>
#include <vector>
int main() {
std::vector<std::vector<std::string>> data{
{"p1", "p2"}, {"100", "p3"}, {"very long string"}};
unsigned int longest_row = 0;
for (const auto &row : data) {
unsigned int rowlength =
fmt::formatted_size("{}", fmt::join(row.begin(), row.end(), ""));
longest_row = std::max(longest_row, rowlength);
}
// Explanation: Print corner - empty string - corner, but pad "empty string"
// longest row times with "middle piece" > is for right-aligned padding
// (doesn't matter for empty string)
fmt::print("╔{:═>{}}╗\n", "", longest_row);
for (const auto &row : data) {
// ^ is for centered padding
// fill with " " (we could omit this, but I think it's clearer)
const std::string this_row =
fmt::format("{}", fmt::join(row.begin(), row.end(), ""));
fmt::print("║{: ^{}}║\n", this_row, longest_row);
}
fmt::print("╚{:═>{}}╝\n", "", longest_row);
}
备注:
- 用 std::vectors 替换了您的字符串数组。只是更方便。
- 无需使用转义序列在字符串中包含 unicode 字符,除非您的编译器很糟糕。
- 后来了解了
formatted_size,让事情变得简单