【问题标题】:How to format an 2d array of different type sized strings (e.g. x, xxx ,xx ,xxx) to look more square like when printed如何格式化不同类型大小的字符串(例如 x、xxx、xx、xxx)的二维数组,使其在打印时看起来更像方形
【发布时间】:2022-01-03 15:56:33
【问题描述】:

这是我的代码有没有人知道我可以如何格式化它,使它看起来更像一个正方形,而不是由于每个元素中的不同字符大小。

1

int main() {
     string a[4][4]= {{"\xC9","\xCD","\xCD","\xBB"},
                     {"\xBA","p1","p2","\xBA"},
                     {"\xBA","100","p3","\xBA"},
                     {"\xC8","\xCD","\xCD","\xBC"}};
    printSquare(a);

这是我的代码,但输出看起来很有趣

【问题讨论】:

  • 您不能对框架进行硬编码。您必须根据字符串的长度实际计算框架的上部和下部的宽度。只有遍历列中的所有数据才能找到最长的字符串。

标签: c++ arrays string matrix formatting


【解决方案1】:

这里没有真正的捷径:你必须把它们都拉到相同的长度。选择哪种长度:很难。您可能首先必须制作所有行,然后找到最长的行,将所有行格式化为具有相同长度,然后制作顶部和底部栏。

可以在标准 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);
}

备注:

  1. 用 std::vectors 替换了您的字符串数组。只是更方便。
  2. 无需使用转义序列在字符串中包含 unicode 字符,除非您的编译器很糟糕。

  1. 后来了解了formatted_size,让事情变得简单

【讨论】:

  • 什么是 fmtlib?此处带有简短说明的链接会有所帮助。
  • 简短描述字面意思是“支持格式字符串;查看我的代码以获取简短示例”,@CroCo :) 但你是对的,链接会有所帮助。然而,它在整个互联网上:fmt 的最大部分是 C++20 的一部分(只是尚未被标准库广泛采用,因为尚未交付给用户)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2020-10-18
  • 2011-04-07
  • 2016-12-24
  • 2011-12-04
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多