如何用“ | | ”打印空格直到行结束

How can I print the empty spaces with " | | " until the line ends

我正在使用矢量,我想知道如何打印中间的空白区域直到行结束。

void print_vector(const std::vector < int > & v, int print_cols, int col_width) {
  //dash
  cout << string(print_cols * (col_width + 2) + 1, '-');
  cout << endl;
  //printing the vector in formated output
  cout << "|";
  for (size_t x = 0; x < v.size(); x++) {

    cout << right << setw(col_width) << v[x] << " |";
    //prints new line if it reaches limit of numbers per line
    if ((x + 1) % print_cols == 0) cout << endl << "|";

  }

  //dash
  cout << endl << string(print_cols * (col_width + 2) + 1, '-');
  cout << endl;
}

这是我当前的输出:my output so far 抱歉,我不能嵌入图像,但它不允许。 但这是我想要的输出 output needed

您可以在已有的循环之后和底行破折号之前添加一个额外的循环:

  • 循环将打印给定数量的空白列。
  • 空白列数可以计算为print_cols - v.size() % print_cols
  • 如果空白列数等于总列数,则不应执行循环。这将打印一整行空列。当您要打印的矢量的元素数量恰好是列数的倍数时,就会发生这种情况。
  • 循环的每次迭代都应打印 col_width + 1 空格和 '|'(或者如果您愿意,为了使其与其他代码更一致,col_width 空格加上" |").

但是您应该解决代码的另一个问题:

  • 到达行尾的检查(启用打印新行和 '|')应该改为检查开始一行。
    如果你在最后这样做,对于向量的最后一个元素进入最后一列的情况,你将不必要地添加一个新行。
    在一开始就这样做,因为你知道你至少还有一个数字要显示,你可以打印 "\n|" 然后是数字。
    检查 x % print_cols == 0 会告诉您 x 是否是一行第一个元素的索引。

[Demo]

#include <iomanip>  // setw
#include <iostream>  // cout
#include <numeric>  // iota
#include <string>
#include <vector>

void print_vector(const std::vector<int>& v, int print_cols, int col_width) {
    // dash
    std::cout << std::string(print_cols * (col_width + 2) + 1, '-');

    // printing the vector in formated output
    for (size_t x = 0; x < v.size(); x++) {
        // prints new line if it is the first element of the line
        if (x % print_cols == 0) {
            std::cout << "\n|";
        }
        std::cout << std::right << std::setw(col_width) << v[x] << " |";
    }
    // prints last empty columns
    if (int number_of_blank_columns = print_cols - v.size() % print_cols;
        number_of_blank_columns != print_cols) {

        for (int x = 0; x < number_of_blank_columns; x++) {
            std::cout << std::string(col_width + 1, ' ') << "|";
        }
    }

    // dash
    std::cout << "\n" << std::string(print_cols * (col_width + 2) + 1, '-') << "\n";
}

int main() {
    {
        std::vector<int> v(8);
        std::iota(std::begin(v), std::end(v), 100);
        print_vector(v, 5, 4);
    }
    std::cout << "\n";
    {
        std::vector<int> v(10);
        std::iota(std::begin(v), std::end(v), 100);
        print_vector(v, 5, 4);
    }
}

// Outputs:
//
//   -------------------------------
//   | 100 | 101 | 102 | 103 | 104 |
//   | 105 | 106 | 107 |     |     |
//   -------------------------------
//
//   -------------------------------
//   | 100 | 101 | 102 | 103 | 104 |
//   | 105 | 106 | 107 | 108 | 109 |
//   -------------------------------
void print_vector(const std::vector < int > & v, int print_cols, int col_width) {
  //dash
  cout << string(print_cols * (col_width + 2) + 1, '-');
  cout << endl;
  //printing the vector in formated output
  cout << "|";
  size_t x = 0;
  for (x = 0; x < v.size(); x++) {

    cout << right << setw(col_width) << v[x] << " |";
    //prints new line if it reaches limit of numbers per line
    if (x < v.size() - 1) {
      if ((x + 1) % print_cols == 0) {
         cout << endl << "|";
      }
    }

  }
  size_t remain = print_cols - (x % print_cols);
  for (size_t i = 0; (remain != print_cols) && i < remain; ++i) {
    cout << right << setw(col_width) << " " << " |";
  }
  //dash
  cout << endl << string(print_cols * (col_width + 2) + 1, '-');
  cout << endl;
}

示例输出:

-------------------------------------------------
|         1 |         2 |         3 |         4 |
|         5 |         6 |         7 |         8 |
|         9 |           |           |           |
-------------------------------------------------

-------------------------------------
|         1 |         2 |         3 |
|         4 |         5 |         6 |
|         7 |         8 |         9 |
-------------------------------------