【问题标题】:Formatting Columns with cout and Strings使用 cout 和字符串格式化列
【发布时间】:2015-07-12 03:32:40
【问题描述】:

晚上好!我希望我可以就 cout 语句中的字符串格式向您寻求帮助。

目标是让所有列左对齐,最大宽度为colWidth

在下面的输出中,您会注意到列宽按需要执行,除非字符串长度低于列宽(与库存项目 3 一样)。如果我将string(strArray[i].begin(), strArray[i].begin() + colWidth) 替换为strArray[i],则正好相反,任何低于列最大值的字符串元素都可以,但其他任何内容都会溢出并推出文本。

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib>
using namespace std;

int main()
{
    string strArray[20] = {"mumblemumble1","mumblemumblemumble2","mumble3","mumblemumblemumblemumble4","mumblemumblemumble5","mumble6","mumblemumblemumblemumble7","mumblemumblemumble8","mumble9","mumblemumblemumblemumble10","mumblemumble11","mumblemumblemumble12","mumble13","mumblemumblemumblemumble14","mumblemumblemumble15","mumblemumble16","mumblemumblemumble17","mumble18","mumblemumblemumblemumble19","mumblemumblemumble20"};
    int cols = 2;       // The number of columns to display
    int colWidth = 10;  // Width allowed for title output
    int colCount = 0;   // Used with mod (%) to provide a new line when needed

    cout << endl << endl << "Number of titles in inventory: " << 20;
    cout << endl << endl;

    for(int i = 0; i < 20; i++)
    {
        cout << setw(4) << right << (i + 1) << ") " << left << setw(colWidth) << string(strArray[i].begin(),strArray[i].begin() + colWidth);
        if ((i+1) % cols == 0)
            cout << endl;
    }

    return 1;
}

产生以下输出:

Number of titles in inventory: 20

   1) mumblemumb   2) mumblemumb
   3) mumble3   4) mumblemumb
   5) mumblemumb   6) mumble6
   7) mumblemumb   8) mumblemumb
   9) mumble9  10) mumblemumb
  11) mumblemumb  12) mumblemumb
  13) mumble13  14) mumblemumb
  15) mumblemumb  16) mumblemumb
  17) mumblemumb  18) mumble18
  19) mumblemumb  20) mumblemumb

【问题讨论】:

  • 这个代码string(strArray[i].begin(),strArray[i].begin() + colWidth)在字符串少于10个字符时抛出异常(例如'mumble3')。
  • 啊 - 我无法在我的终端上看到它。谢谢!
  • 这是唯一的问题吗?
  • 我相信是这样 - 这是我开始意识到的一个更大问题的一部分,它源于输入文件字符串捕获 \r 从 Windows 文件返回并进一步弄乱了格式。暂时删除上面的问题。感谢您的协助!
  • 您可以检查字符串的大小,如果它太小,则添加空格“”,直到它足够长。这应该避免异常并保持您想要的格式。

标签: c++ arrays string formatting cout


【解决方案1】:

当字符串短于 10 个字符(例如“mumble3”)时,此代码 string(strArray[i].begin(),strArray[i].begin() + colWidth) 会引发异常。

将你的 for 循环更改为:

for (int i = 0; i < 20; i++)
{
    string str = strArray[i];
    while (str.size() < colWidth) {
        str = str + " ";
    }
    cout << setw(4) << right << (i + 1) << ") " << left << setw(colWidth) << string(str.begin(), str.begin() + colWidth);
    if ((i + 1) % cols == 0)
        cout << endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多